数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3 输出:3
示例 2:
输入:n = 11 输出:0
限制:
0 <= n < 2^31
先计算好不同长度的数字相应的区间内有多少个数字以及数字的个数,比如:
0-9:10*1
10-99:90*2
100-999:900*3
根据这个计算出查询的n所在的区间以及第几个数字的第几位。
class Solution {
public:
int findNthDigit(int n) {
long long ntmp = n;
ntmp++;
long long cnt = 1;//数字有几位数
long long num = 10;//该位数的数字有多少个
while (ntmp - cnt*num > 0) {
ntmp -= (cnt*num);
cnt++;
if (cnt == 2) {
num = 90;
}
else {
num = num * 10;
}
}
if (cnt == 1) { //数字在0-9区间内
return ntmp-1;
}
else { //其他区间
long long pos_pre = (ntmp-1)/cnt; //这个区间的第几个数字
long long pos_now = (ntmp-1)%cnt; //这个数字的第几位数
long long start = 1; //这个区间的起点(起始位置的数字)
while (cnt > 1) {
cnt--;
start*=10;
}
long long tmp = start + pos_pre; //查询的n位所在的真实数字
long long ans;
while (pos_now > 0) {
pos_now--;
start /= 10;
}
ans = (tmp/start)%10; //真实数字的第几位
return ans;
}
}
};