class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    int findNthDigit(int n) {
        // write code here
        if(n < 10) return n;
        int num_len[10];
        int n_len = 9;
        // 长1的数有10个,长2的90个,长3的900个...先判断n落在长度为多少的区间
        for(int i = 1; i<9 ; i++){
            if(i == 1) num_len[i] = 10;
            else{
                num_len[i] = num_len[i-1] + i * 9 * (int)pow(10, i-1);
            }
            if(n < num_len[i]){
                n_len = i;
                break;
            }
        }
        //计算第几个数字,减去上一个长度数字的累计个数
        int cnt = (n - num_len[n_len - 1]) / n_len;
        //计算在这个数字的偏置位数
        int bias = (n - num_len[n_len - 1]) % n_len;
        int final_num = (int)pow(10, n_len-1) + cnt;
        //不能直接返回string的下标强制转换成int的结果,否则会返回字符的数字编码,需要减去字符0
        return to_string(final_num)[bias] - '0';
    }
};