剑指offer(C++)-JZ44:数字序列中某一位的数字(算法-搜索算法)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

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

数据范围: 0≤n≤10^9 

示例:

输入:

10

返回值:

1

解题思路:

本题考察算法-搜索算法的使用。该题算是一道简单的数学题。

个位数字1-9共9位数字,9个位数;十位数字10-99共9*10个数字,90*2个位数;百位数字100-999共9*100个数字,900*3个位数。

基于上述规律,先确定目标位处于哪个区间,再根据当前区间内单个数字的位数进行推算,即可得到目标位的数字。

测试代码:

class Solution {
public:
    int findNthDigit(int n) 
    {
        // 当前的位数,个位是1,十位是2,百位是3
        int digit = 1;
        // 当前位数的起始,个位是1,十位是10,百位是100
        long long start = 1; 
        // 当前位数区间内数字个数,个位是9,十位是180,百位是2700
        long long sum = 9; 
        // 确定n处于哪一位数区间
        while(n > sum)
        {
            n -= sum;
            start *= 10; 
            digit++; 
            sum = 9 * start * digit;
        }
        // 确定n处于哪个数字上
        int num = start + (n - 1) / digit;
        // 确定n处于当前数字的哪一位上
        int index = (n - 1) % digit;
        return to_string(num)[index] - '0';
    }
};

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/126884205