剑指offer(44)

剑指offer(44)

剑指 Offer 44. 数字序列中某一位的数字

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

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

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0

限制:

  • 0 <= n < 2^31

数学规律题:建议多复习

class Solution {
public:
    int findNthDigit(int n) {
        int digit=1;//数位
        long long start=1;//位数的起点 1,10,100...
        long long count=9;//数位数量 数位数量公式 count=9*start*digit
        //可将求解分为三步:
        //1.确定 n 所在 数字 的 位数 ,记为 digit ;
        while(n>count){
            n-=count;//n依次减掉一位数的数位数量,二位数的数位数量,最后当n<count时n就是从start开始计数的
            digit+=1;//数位每次加1
            start*=10;//数位起点每次 乘10
            count=9*digit*start;//每种位数上数字数量=9*digit*start
        }
        //2.确定 n 所在的 数字 ,记为 num ;
        //n从start开始计数,算0,那么就是start+(n-1)
        int num=start+(n-1)/digit;//所以所求的位就在num中
        //3.确定 n 是 num 中的哪一数位,并返回结果。
        //所求数位为数字 num的第 (n - 1)%digit 位( 数字的首个数位为第 0 位)。
        string s=to_string(num);
        int res=s[(n-1)%digit]-'0';
        return res;
    }
};

posted @ 2022-05-04 08:56  BailanZ  阅读(15)  评论(0编辑  收藏  举报