描述
数字以 0123456789101112131415... 的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类推,请你输出第 n 位对应的数字。
数据范围: 0<=n<=10^9
思路
找规律:
0不算
第1个区间[1-9]: 9*1*10^0,第1个数开始,每个数占1个字符,共9个字符
第2个区间[10-99]: 9*2*10^1,第10个数开始,每个数占2个字符,共180个字符,
第3个区间[100-999]: 9*3*10^2,第100个数开始,每个数占3个字符,共2700个字符,
...
因此每个区间的字符数为:count=9*x*10^(x-1),x表示位数,10^(x-1)表示该区间起始数
public class Solution {
public int findNthDigit (int n) {
if( n <= 0){
return 0;
}
int x = 1; // 位数
//要使用long类型
long start = 1; // 区间起始数,1,10,100,1000
long count = 9; // 区间总数
while(n > count) {
//大于9,减去9个字符
//大于99,减去180个字符
//...
n -= count;
x++;
start *= 10;
count = 9 * x * start;
}
//此时n位于第x个区间,每个数占x位
//假设x=2,将该区间的数分组,如:10、11、12、13、14、15...
//n=1、2时,属于第0组,对应的数是10
//n=3、4时,属于第1组,对应的数是11
//计算得出每组的数字,转换为字符串形式
String group = (n - 1) / x + start + "";
//计算是该组的第几个数
int i = (n - 1) % x;
//转换为Int值
return Integer.parseInt(group.charAt(i) + "");
}
}