题目描述
解题思路
可以知道我们需要先求出这个n在哪几位数和哪几位数的区间中,因为不同位数占据的位也就不同。
- 将 101112⋯ 中的每一位称为 数位 ,记为 n ;
- 将 10, 11, 12,⋯ 称为 数字 ,记为 num ;
- 数字 10 是一个两位数,称此数字的 位数 为 2 ,记为 digit;
- 每 digit 位数的起始数字(即:1, 10, 100,⋯),记为 start;
观察上表,可推出各 digitdigit 下的数位数量 countcount 的计算公式:count=9×start×digit
此题解题分三个步骤:
- 求出在哪个区间,根据上面的推导可以使用while循环求出:
注意:n一定每次都需要减去count,这样才能知道n在这个区间的第多少位。
int digit = 1; // 表示数字的位数
long start = 1; // 表示开始的数组
long count = 9; // 表示总共的位数
while (n > count) {
n -= count;
digit += 1;
start *= 10;
count = 9 * digit * start;
}
- 确定n所在的数字
怎么确定n所在的数字?可以把n - 1对当前的digit所占位数相除,因为在这个区间的每个数都是digit位,所以可以通过相除得出。
此时在哪个数确定好了,但是在这个数的第几位呢?因为这个区间的数右digit位,所以可以通过n - 1对digit取余得出第几位,在在第二步求出的数字上截取。
class Solution {
public int findNthDigit(int n) {
int digit = 1; // 表示数字的位数
long start = 1; // 表示开始的数组
long count = 9; // 表示总共的位数
while (n > count) {
n -= count;
digit += 1;
start *= 10;
count = 9 * digit * start;
}
// 此时n就是在区间内求取,n-1的原因是从0开始
// 计算出在第多少个数
long num = start + (n - 1) / digit;
// 计算出在数的第几位
return Long.toString(num).charAt((n - 1) % digit) - '0';
}
}