目录结构
1.题目
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
限制:
0 <= n < 2^31
示例:
输入:n = 3
输出:3
输入:n = 11
输出:0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
由题设易知:
- 一位数:1×9个数字
- 二位数:2×9*10个数字
- 三位数:3×9*100个数字
- ...
- size位数:size×9×10^(size-1)个数字
思路:
- 先计算【第n个数字】属于哪个区间,即计算得到属于size位数区间,进而得到【第n个数字】属于该区间的第几个数(size位数的第一个数索引为0,第n个数字在size位数中索引为(n-1)%size);
- 然后可计算出【第n个数字】属于哪个具体的数num;
- 最后计算【第n个数字】是该具体数的第几位(从左到右),取该位的值返回。
比如n=1000,则有1000-9-180=811<2700,即n为三位数序列的第811位;三位数的第一个数100的索引为0,第811位所在数字索引为(811-1)/3=270,即第n位数字在数字100+270=370中;又因为811%3=1,即第n个数字在370的第一位,也就是3。
public class Offer44 {
@Test
public void test() {
System.out.println(findNthDigit(1000));
}
public int findNthDigit(int n) {
long size = 1, base = 9;
while (n > size * base) {
n -= size * base;
base *= 10;
size++;
}
int num = (int) ((int) Math.pow(10, size - 1) + (n - 1) / size);
int t = (int) Math.pow(10, size - (n % size == 0 ? size : n % size));
return num / t % 10;
}
}
- 时间复杂度:
- 空间复杂度: