数字序列中某一位的数字

原题:

数字以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;
    }
};
posted @ 2020-05-01 23:49  毛毛吃火锅不要锅  阅读(191)  评论(0编辑  收藏  举报