题目

题解

这道题主要是找规律,图示可以看这里

  • 先剔除掉0
  • 1~9, 有9*1=9个数字,占9*1*1=9个数位
  • 10~99, 有9*10=90个数字,占9*10*2=180个数位
  • 100~999, 有9*100=900个数字,占9*100*2=2700个数位
    。。。以此类推
  • 。。。, 有9*digit个数字,占9*digit*i个数位

i代表当前为第几位,同时也代表当前数字所占的数位1,2,3…;digit代表当前的数量级1,10,100…

上面每一段称为一个数字空间,若n超过本次的数字空间,则n减去这一段数字空间的个数,继续迭代;若n在这个数字空间里,则先确定当前属于的数字,为digit+n/i,接着转化为字符串,取其第n%i个数,接着再转化为为int(用当前字符-‘0’)。

class Solution {
public:
    int findNthDigit(int n) {
        n -= 1;
        for(long i=1; i<11; ++i){//i为当前的位数,1,2,3...,同时也是这个数占几位
            long digit = pow(10,i-1);//定义digit为当前位i的数量级,1,10,100...
            //若n在当前这个数字空间,返回这个值
            if(n < 9*digit*i){
                return to_string(digit+n/i)[n%i]-'0';
            }
            //否则n减去这个数字空间的所有数
            n -= 9*digit*i;
        }
        return -1;
    }
};