数字以0123456789101112131415…的格式序列化到一个字符序列中。
在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数求任意位对应的数字。
样例
输入:13
输出:1
分析:
分为3步:第一步:判断是第n位所在的数字num有几位数
数字为1位的有10个数,从0到9。数字为2位的为90个数,从10到99。数字为3位的为900个数,从100到999。
第二步:判断n是num的第几位
第三步:取出n位数
class Solution {
public:
int digitAtIndex(int n) {
//1.判断第n所在的数组num有几位数
long long i = 1;//i表示几位数
long long base = 1;//base表示不同位数的起始值
long long s = 9;//s表示当前位数数字的个数 s的值为9,90,900,9000,。
//一位数有10个数,可以单独处理,第几位数的十足就为几。
if(n <= s) return n;
//s*i为数字位数为i的所有数字的位数。 一位数的总位数为9*1,两位数的总位数为90*2,三位数的总位数为900*3.
while(n > s * i){
//n每次减去数字位数为i的所有数字的位数
n = n - s * i;
//数组位数加1
i ++;
//数字位数为i+1的数字有s*10个。
s = s * 10;
//数字位数为i+1的第一个数为base*10
base = base * 10;
}
//求数字位数为n的数字为多少,以10为例,base =10 ,n = 1,i =2,如果直接按n/i来计算的话,1/2为0,所以要上取整为(n+1)/i.
int num = base + (n + 1)/ i - 1;
int num_index = n % i;
// 取出第n个数字
for(int j = 0;j < i - num_index ;j++){
num = num / 10;
}
return num % 10;
}
};