数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
-
示例 1:
输入:n = 3
输出:3 -
示例 2:
输入:n = 11
输出:0 -
限制:
0 <= n < 231
思路:digit:表示当前数字是几位数。start:表示位数为digit的数是从哪一个数开始的。count表示位数为digit的数字共占了多少位。
从1开始计算,1到9占了9位,count = 9,如果 n > count,说明第n位不在1~ 9这个区间,n -= count,下一个区间是2位数,digit = 2,从10开始,start = 10,占的位数为:digit * start * 9 (1 ~ 9有9个数,10 ~ 99有90个数,100 ~ 999有900个数)。当n < count时,第n位在start ~ start * 10 - 1这个区间。
num = start + (n - 1) / digit;num就是第n位所在的数。令num为string,n = (n - 1) / digit,num[n]就是第n为对应的数字。
int findNthDigit(int n) {
int digit = 1;
long start = 1;
long count = 9;
while (n > count) { // 计算n是在几位数的区间
n -= count;
digit += 1;
start *= 10;
count = digit * start * 9;
}
long num = start + (n - 1) / digit; // num 就是第 n 位所在的数
int place = (n - 1) % digit; // 从0开始数,place 指的是 num 的第几位数
digit = digit - 1 - place; // 计算对于 num 这个数,place 后面还有几个数字
while (digit > 0) {
num /= 10; // 把 place 后面的数全部清空
digit -= 1;
}
return num % 10; // 返回 place 所指的那个数字
}
int findNthDigit(int n) {
long digit = 1, start = 1, count = 9;
while (n > count) {
n -= count;
digit++;
start *= 10;
count = digit * start * 9;
}
int num = (n - 1) / digit + start; // 第 n 位所在的数
int place = (n - 1) % digit; // 在 num 上的具体位置, 从 0 开始计算
while (place > 0) {
num %= start; // 把 place 前面的数清空
start /= 10;
place--;
}
return num/start;
}