思路:模拟
找规律:
1位数:1-9,一共9个数字
2位数:10-99,一共90个数字,即9 * 10 * (2 - 1)
3位数:100-999,一共900个数字,即9 * 10 * (3 - 1)
k位数,包括的位数一共有k * 9 * 10^(k - 1)位。
比如:找第490位是多少?
9 +180 < 490
9 + 180 + 2700 > 490,所以一定是个三位数。
490-9-180=301。
301/3=100,所以应该是在100+100+1=201这个数字上。
301%3=1,所以是在201的第一个数字,也就是2上面。所以结果是2。
注意的是:如果%k==0,则是在1…(k个0)+ 301/3的最后一个数字。
整理思路:
1:确定是几位数
2:确定属于哪个数
3:确定是第几位
class Solution {
public:
typedef long long ll;
int findNthDigit(int n) {
//确定是几位数
ll k = 1;
while (n > 9 * k * pow(10, num - 1)) {
n -= 9 * k * pow(10, num - 1);
k++;
}
//确定属于哪个数
ll tmp = n / k; //num表示几位数
ll nums = pow(10, k - 1) + tmp;
//确定是第几位
ll yushu = n % k;
if (!yushu) return (nums - 1) % 10;
string tmp2 = to_string(nums);
return tmp2[n % k - 1] - '0'; //
}
};
10的k次方: pow(10, k) ,用pow()函数
易错点:第一个数字对应的是下标0的值。