剑指 Offer 44. 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
0 <= n < 2^31
解:
/*
范围 digit 范围内位数
0~9 1 10
10~99 2 902
100~999 3 9003
*/
//确认n所在数字,需确认n所在数字的位数digit 和 n所在数字所在数字范围的起始数start
//则num = start + (n - cnt)/digit,cnt为start之前的总位数
//已知num,且已知n在num中的第(n - cnt)%digit位,将num转换为字符串,再取该位即可
class Solution {
public:
int findNthDigit(int n) {
long start = 1;
int digit = 1;
long cnt = 10;
while(n > cnt)
{
start *= 10;
digit++;
cnt += 9*start*digit; //下一个start处
}
cnt -= 9*start*digit; //当前start处
int num = start + (n - cnt)/digit;
string str = to_string(num); //数字转字符串数字
char tmp = str[(n - cnt)%digit];
return tmp - '0';
}
};
n的十进制位数为log 10 n
故while循环,时间复杂度为O(logn),数字转字符串,时间复杂度为O(logn),共O(logn)。
由于使用了字符串转数字,故空间复杂度为O(logn)。