《剑指offer》面试题44. 数字序列中某一位的数字

问题描述

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。
示例 1:

输入:n = 3
输出:3
示例 2:

输入:n = 11
输出:0
 

限制:

0 <= n < 2^31

代码

我们观察到,一位的数[1,9]共9个(不考虑0),二位的数[10,99]共90个,三位的数[100,999]共900个,因此我们用len表示数字的位数,dig表示在该位数下有多少个数字,第一步我们需要知道第n个数字的长度是多少,这一个通过while循环可以实现,第二步要找到第n个数字所在的实际数字(num),比如给定\(n=89\),因为\(89-1*9=80>0,80-2*90<0\),我们知道它属于[10, 99]长度为2的数字这个区间。然后我们将89 - 9(长度为1的数字字符段长度) = 80,由于知道它所处的数字长度是2,我们不考虑10,则\((80-1)/2=39\),这代表是[11,99]中的第39个数,因为是从10开始计数的,因此这个数是\(10+39=49\),又因为\((80-1)%2=1\),这代表是\(49\)的第二个数\(9\).

class Solution {
public:
    int findNthDigit(int n) {
        long dig = 9,len = 1,num=1;
        while(n > dig*len)
        {
            n -= dig*len;
            ++len;
            dig *= 10;
            num *= 10;
        }
        num += (n-1)/len;
        string t = to_string(num);
        return t[(n-1)%len]-'0';
    }
};

结果

执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :6 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-05-01 08:36  曲径通霄  阅读(137)  评论(0编辑  收藏  举报