1. 题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/eeeb6ad8ee5e44698ee191a728edebf6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Zi_6LSi57un57ut5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. 思路
(1) 数学法
- 根据数学规律可知,个位数0-9的长度之和为(101-100)*1=10,十位数10-99的长度之和为(102-101)*2=180,百位数100-199的长度之和为(103-102)*3=2700,……,由此可以算出第n位数所在的数字是几位数。
- 以n=194为例,得到n所在的数字是三位数,先求出n与三位数之前所有数字长度之和的差,即194-190=4,然后求出这之间包含了几个三位数,即4/3=1,再加上三位数的起始数字100,即可求出n所在的数字是101,最后求出n与101之前所有数字长度之和的差,即194-193=1,可以得到第n位数是101的第1位数,即0。
3. 代码
public class Test {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.findNthDigit(194));
}
}
class Solution {
public int findNthDigit(int n) {
int digit = 1;
long maxLen = 10;
while (maxLen < n) {
digit++;
maxLen += (Math.pow(10, digit) - Math.pow(10, digit - 1)) * digit;
}
int curLen = (int) (maxLen - (Math.pow(10, digit) - Math.pow(10, digit - 1)) * digit);
int startNum = (int) Math.pow(10, digit - 1);
int count = (n - curLen) / digit;
int curNum = startNum + count;
curLen += count * digit;
return String.valueOf(curNum).charAt(n - curLen) - '0';
}
}