剑指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 @   BailanZ  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示