[Lc]面试题44数字序列中某一位的数字
Contents
题目
题解
这道题主要是找规律,图示可以看这里
- 先剔除掉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;
}
};
Author ChrisHRZ
LastMod 2020-06-10