面试题44. 数字序列中某一位的数字.................

这个题可以说基本就是考察数学找规律

首先建立一个数组 用来判定n在几位数的范畴里

0 - 9 占 10位

10 - 99 占180 位

100 - 999 占 2700位

。。。

由于从0开始 数组第一个数是9 第二个数是9 + 180 = 189 第三个数是 189 + 2700 = 2889 以此类推

通过数组元素跟n比较大小 可以得出n所在数是一个几位数

接下来就是找在这个几位数范围中的第几个数 和 目标数的第几位

列如 97 这个数

第一步 比较大小 97 < 189 所以n在二位数中 k  = 2

第二步 (97 - 9)/ k = 44 所以n在二位数中第44 个数中 二位数第一个是10 第44 个就是 53

第三步 (97 - 9) % k = 0 这里余数是0 所以在这个数的第0 位 这里第0位也就是上个二位数53的最后一位3

如果n是98 余数是1 也就是 54这个数的第一位 5

下面是代码的实现

class Solution {
public:
    int findNthDigit(int n) {
        if( n < 10)return n;
        vector nums(11);
        nums[1] = 9;
        for(int i = 2; i < 11; i++){
            nums[i] = i * 9 *pow(10, i - 1) + nums[i - 1];
        }
        int k = 1;
        while(n > nums[k]){
            k++;
        }
        int cha = n - nums[k - 1];
        if(cha == 1)return 1;
        if(cha < k)return 0;
        int pos = cha % k;
        int num = pow(10, k - 1) + cha / k - 1;
        if( pos == 0){
            return num % 10;
        }
        num++;
        int tmp = k - pos;
        while(tmp){
            num /= 10;
            tmp--;
        }
        return num % 10;
    }
};

 

你可能感兴趣的:(算法)