Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
Note:
n is positive and will fit within the range of a 32-bit signed integer (n< 231).
Example 1:
Input: 3 Output: 3
Example 2:
Input: 11 Output: 0 Explanation: The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... is a 0, which is part of the number 10.
有一个序列,它是123456789101112...这样的。第3个是数字3,第11个是10中的0.
1-9,9个数,每个数占1位
10-99,90个数,每个数占2位
100-999,900个数,每个数占3位
...
由此我们可以先计算出第n位在上面哪个分段。样例中11在第二段(10-99),然后计算剩余位数(11-9)占了几个数字((11-9-1)/2),得出这位数在start(10)+((11-9-1)/2)中,然后计算这位数在10中是第几个即可。
class Solution {
public:
int findNthDigit(int n) {
int len=1;
int cnt=9;
int start=1;
while(n/len>cnt){//n>cnt*len溢出
n=n-len*cnt;
len++;
cnt=cnt*10;
start=start*10;
}
start=start+(n-1)/len;//-1是因为start本身就占了一个数字
string s=to_string(start);
return s[(n-1)%len]-'0';//-1是因为下标从0开始
}
};