题目来源
解题方法
首先我们要知道目标数字是几位数,1-9共9个数,10-99共90个数且一个数占2位,100-999共900个数且一个数占3位
举例:532
532-9-90*2=343 < 900 * 3,所以我们可以知道这是三位数里面的第343位,那么每3个是一组,所以343/3=114余1,即100+114=214里面的第1个数2
class Solution {
public:
int findNthDigit(int n) {
long base = 9;
int digit=1;
while(n-base*digit > 0){
n-=(base*digit);
base*=10;
digit++;
}
int idx = n % digit; // 该数的第几个
if(idx==0)
idx=digit;
int num=1;
for(int i=1;i<digit;i++){
num*=10;
}
num += (idx==digit) ? n/digit-1 : n/digit;
for(int i=idx;i<digit;i++){
num/=10;
}
return num%10;
}
};
明白思路以后就可以进行简化
class Solution {
public:
int findNthDigit(int n) {
n-=1;
for(long digit=1; digit < 11; digit++){
int firstNum=pow(10,digit-1);
if(n<firstNum*9*digit){
return int(to_string(firstNum+n/digit)[n%digit] - '0');
}
n-=(firstNum*9*digit);
}
return 0;
}
};
其中n-=1的原因,我们拿156进行讲解,如果n%digit原来的值是2,说明希望拿到5,那么在“156”这个字符串中对应下标就是1,如果n%digit原来是1,说明希望拿到1,那么在“156”这个字符串中对应下标是0,如果n%digit原来是0,说明希望拿到155的5,对应下标为2,因此将n-1,能够正确拿到字符串对应下标的数字,即n%digit的0,1,2与字符串中对应下标的关系是-1,0,1,其中-1就代表上一个数的最后一个