数字序列中某一位的数字

class Solution {
public:
    int digitAtIndex(int n) {
        if(!n)  return 0;
        long long start=1,len=1,cnt=1;//记录区间的起始位置,记录区间长度,cnt记录当前是几位数
        //往后走,跨度为一个区间
        while(1)
        {
            len=start*9*cnt;
            if(n<len)   break;
            n-=len;
            start*=10;
            cnt++;
        }
        //从当前区间开头往后走,跨度为一个数字
        start+=(n+cnt-1)/cnt-1;//上取整再-1
        //也可以通过下面的循环实现
        // while(n>cnt)
        // {
        //     n-=cnt;
        //     start++;
        // }
        int offset=n%cnt?n%cnt:cnt;//offset记录数字里的第几位数,n%cnt==0需要特判
        //求start的第offset位数
        for (int i = 0; i < cnt-offset; i ++ )  start/=10;//右移
        return start%10;
    }
        
};
posted @   穿过雾的阴霾  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示