描述

数字以 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) + "");
    }
}