链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
我倒在了在这个0上。
思路: a[i]代表i位所有数的位数之和。
s[i]代表a的前缀和。
po[i]代表i位数的开始的数字,例如个位数开始的数字是0,,3位数开始的数字是100
输入n,判断n处于几位数的区间内。
pos = lower_bound(s+1,s+i+1,(long long)n + 1) - s;
n在pos位数所处的区间内。
然后n减去s[pos-1],相当于在相同位数的数字列里面找第n位
这样就好找了,k=n/pos 如果整除,则n是第k个数的最后一位
如果不整除,km=n%pos 则n是第k+1个数的第km位
m = po[pos]+ k ,m代表n所在的那个pos位的数。
转化为字符串 返回第km位即可
class Solution {
public:
long long s[100010];
int findNthDigit(int n) {
s[1] = 10;
long long temp = 90;
int i;
for(i = 2; ; i++){
s[i] = temp * i + s[i - 1];
temp = temp * 10;
if(s[i] > 1LL<<31)break;
}
long long po[15];
po[1] = 0;
po[2] = 10;
for(i = 3; i < 10; i++){
po[i] = po[i - 1] * 10;
}
int pos = lower_bound(s + 1, s + i + 1, (long long)n+1) - s;
n -= s[pos - 1];
int k = n / pos;
int km = n % pos;
int m = po[pos] + k;
string ss = to_string(m);
char c = ss[km];
int ans = c - '0';
return ans;
}
};