刷题:牛客JZ44 数字序列中某一位的数字

114 阅读1分钟

网址: www.nowcoder.com/practice/29…

描述

数字以 0123456789101112131415... 的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类题,请你输出第 n 位对应的数字。

数据范围: 0 \le n \le 10^9 \0≤n≤109

public:
    int findNthDigit(int n) {
        int sum0=0;
        long long sum1=0;
        int l=1;  //l是第n位所在自然数的长度
        for(;;l++)
        {
            sum1=sum1+l*9*(pow(10,l-1));
            if(sum1>=n)
            { 
                break;
            }
            sum0=sum1; //sum0是长度为l-1及以下的自然数所占的总位数
        }
        int j=(n-sum0)/l;   //在sum0位和n位之间有j个长度为l的自然数
        int x=n-sum0-l*j;   //第n位就是所在自然数的第x位
        int npre=pow(10,l-1)+j-1;   //npre是所在自然数的前一个数
        if(x==0)            //若x为0,说明第n位是前一个自然数的最后一位
            return npre%10;
        else return (npre+1)/(int(pow(10,(l-x))))%10;
    }
};//自然数是指按题目中的顺序组成该字符序列的每个数,比如“11121314”中的11和12都分别是自然数

总结: 要求出第n个位所在的那个自然数,先根据n这个位数,求出这个数字的长度(也就是l),然后利用n与sum0的差求出所在的那个自然数