题目描述
解题思路
可以知道我们需要先求出这个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';}}
