45.数字序列中某一位的数字

数字以 0123456789101112131415… 的格式序列化到一个字符序列中。

在这个序列中,第 5 位(从 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。

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

数据范围:
0≤ 输入数字 ≤2147483647

样例:

输入:13
输出:1

代码:

class Solution {
    public int digitAtIndex(int n) {
        //处理0-9的直接返回
        if(n<10)return n;
        //初始化数字位数(1表示个位数)
        int digit = 1;
        //digit位数的起始数字(1位数从1开始,2位数从10开始)
        long start = 1;
        //digit位数的数字总位数(1位数有9个数字,2位数有90个数字)
        long count = 9;
        
        //确定n所在的数字位数范围
        //当n大于当前位数范围的总位数时,继续向更高位数查找
        while(n>count){
            //减去当前位数范围的总位数
            n-=count;
            //位数+1
            digit+=1;
            //起始数字*10
            start*=10;
            //计算新的位数范围内的总位数
            count = 9*start*digit;
        }
        
        //找到具体的数字
        //n-1是因为序列从0开始计数,digit得到是第几位数字
        long num = start + (n-1)/digit;
        
        //确定数字中的具体位
        //(n-1)%digit计算是该数字的第几位(0表示第一位)
        //将数字转为字符串后取对应位置的字符,再转为数字
        return Long.toString(num).charAt((n-1)%digit)-'0';
    }
}
posted @ 2025-05-29 08:45  回忆、少年  阅读(38)  评论(0)    收藏  举报