一、题目描述:400. 第N个数字(简单)
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。
注意:
n 是正数且在32为整形范围内 ( n < 231)。示例 1:
输入:
3输出:
3
示例 2:输入:
11输出:
0说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
找数学规律
1~9,是一位,总共1*9
10~99 是两位,总共2*9*10
100~999是三位 总共3*9*100
所有每次取整数量总和,count = sum(i*9*pow(i-1)) ,找到count<n的i的最小值,然后剩下n-count里面寻找第num = (n-count)/i个数,当mod = (n-count)%i == 0时,取num的最后一位,当mod>0时,取num+1的i-mod-1位
三、代码
class Solution {
public:
int findNthDigit(int n) {
int i = 1;
int count = 0;
bool is_out = false;
while(count < n)
{
//cout<<count<<endl;
if(INT_MAX - count < 9 * i * pow(10,i-1))
{
is_out = true;
break;
}
count += 9 * i * pow(10,i-1);
i++;
}
if(i == 2)
{
return n;
}
if(is_out == false)
count -= (9 * (i-1) * pow(10,i-2));
else
i++;
int left = n - count;
int num = left/(i-1);
int mod = left%(i-1);
int num_now = pow(10,i-2) + num-1;
int tmp = i -1 - mod;
int mod_left = 0;
if(mod == 0)
return num_now%10;
num_now++;
for(;tmp >= 0;tmp--)
{
mod_left = num_now % 10;
num_now =num_now / 10;
}
return mod_left;
}
};