题目描述:
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
示例1:
输入:n = 3 输出:3
示例2:
输入:n = 11 输出:0
解题思路:
1、找规律: 将数字的位数记为digit,范围为1,2,3,…;将每digit位数的起始数字(即1,10,100,…)记为start,每digit位数的所有数字的数位数量记为count,比如当digit = 2时,start = 10,count = digit * start * 9 = 180。
因此可以循环比较每digit位数所对应的count和n的大小,并不断更新n,count,start和digit的值,当n <= count时,说明第n位所对应的数位是digit位数。这个时候就可以查找所求数位对应的数字:num = start + (n - 1) / digit,最后就可以确定所求数位在num的第(n - 1) % digit位。
注意点: 第二步和第三步的计算过程是n - 1,而不是n,原因见下图。同时为了防止count、start和num的溢出问题,数据类型使用long。
时间复杂度和空间复杂度: 时间复杂度为O(log10n),空间复杂度为O(log10n)。
以上解法和图片参考:Krahets大佬的题解
实现代码:
public int findNthDigit(int n) { int digit = 1; long start = 1; long count = 9; while(n > count){//第一步 n -= count; start *= 10; digit++; count = start * digit * 9; }//第二步 long num = start + (n - 1) / digit; return String.valueOf(num).charAt((n - 1) % digit) - '0';//第三步 }