[剑指offer]数字序列中某一位的数字
题目描述
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
0 <= n < 231
解题思路
数字范围 | 数量 |
---|---|
0~9 | 10 |
10~99 | 2*90 |
100~999 | 3*900 |
1000~9999 | 4*9000 |
…… | …… |
- n<=9,直接返回n
- n>9,先找到n是在几位数的范围内,然后找到这个数字,再判断是这个数字的第几位
实现代码
class Solution {
public:
int findNthDigit(int n) {
if(n<=9)
return n;
n=n-10;
long dig=2;
long count=90;
while(n>dig*count){//找到n是在几位数的范围内,dig位数
n-=dig*count;
dig++;
count*=10;
}
long num=pow(10,dig-1)+n/dig;//找到这个数
if((n+1)%dig==0)//n是从0开始的位置,是第(n+1)个数,如果余数是0,就是这个数的最后一位
return num%10;
else{//如果余数是i,就是这个数的第i位,需要除 dig-i 个10再取余获得
num=num/pow(10,dig-(n+1)%dig);
return num%10;
}
}
};