数字以 0123456789101112131415… 的格式序列化到一个字符序列中。
在这个序列中,第 5 位(从 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。
请写一个函数求任意位对应的数字。
数据范围
0≤ 输入数字 ≤2147483647
样例
输入:13
输出:1
模拟一个实例,n = 1022,匹配到的数是377,对应它的第2位,也就是3后面的那个7,输出ans是7。
833 % i的结果,如果能除尽,就是number的最后一位,也就是i位;不然就是number中从第1位算起的第n % i位(下标从1开始哦)。number %10就ok。1. 确定寻找的n处于几位数的范畴,1位数,2位数,还是3位数....这里的时度是O(1)。
2. 确定是i位数后,确定是i位数中的哪个,比如说4位数的第256个数,1000 + 256 - 1 = 1255,1255就是4位数的其中1个。
这里的时度是O(1),用到了除法。
3. 确定是哪个数以后(比如确定是1255这个数以后),看看数字n是这个数的第几位,拿1255来举例子,是1还是2还是5还是5。
这里是取余,时度是O(1)的,然后取出来是哪一位数,最多是10位,所以最多是10次操作,时间复杂度为O(log10n)。
class Solution {
public:
int pow10(int x){
int res=1;
for(int i=0;i<x;i++){
res*=10;
}
return res;
}
int digitAtIndex(int n) {
if(n<10){
return n;
}
int m=n-9;
long long k=2;
while(m>9*k*pow10(k-1)){
m-=9*k*pow10(k-1);
k++;
}
//t---第t个k位数
int t=m/k;
int s=m%k;
int num=pow10(k-1);
num+=t;
if(s==0){
return (num-1)%10;
}
else{
for(int i=0;i<k-s;i++){
num/=10;
}
return num%10;
}
}
};
