题目链接:leetcode.
我能做的。。。
class Solution {
public:
int findNthDigit(int n) {
if(n < 10)
return n;
}
};
看了大佬题解后:
-
先求出n是在几位数表示范围内
- 1位数9个 以1开头 共占9位
- 2位数90个 以10开头 共占180位
- 3位数900个 以100开头 共占2700位
- … …
-
再算出n对应的是该范围内的哪一个数字num
-
再算出是数字num中的哪一位
/*
37 / 70 个通过测试用例 1000000000溢出
countt和start改为long型
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了95.63%的用户
*/
class Solution {
public:
int findNthDigit(int n) {
if(n == 0)
return n;
int start = 1;
long digit = 1, countt = 9;
//n落在digit位数范围内
while(n > countt)
{
n -= countt;
digit++;
start *= 10;
countt = 9 * start * digit;
}
//n对应的num是几
int num = start + (n - 1) / digit;
//n对应num的第几位
int tmp = (n - 1) % digit;
for(int i = digit - 1;i > tmp;--i)
{
num /= 10;
}
return num % 10;
}
};