剑指offer 面试题44 数字序列中某一位的数字

问题:在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。 

输入:n

输出:数字

思路:

判断是几位数

确定对应着的数值target

确定返回值是target中的哪个位

代码:

class Solution {
public:
    int countOfIntegers(int digits)
    {
        if(digits==1)
           return 9;
        int count=(int)pow(10,digits-1);
        return 9*count;
    }
    int beginNumber(int digits)
    {
        // if(digits==1)
        //     return 0;
        return (int)pow(10,digits-1);
    }
    int digitAtIndex(int n,int digits)
    {
        int number=beginNumber(digits)+n/digits;
        int indexFromRight=digits-n%digits;
        if(n%digits==0)
            return (number-1)%10;
        for(int i=0;i<indexFromRight;++i)
            number /=10;
        return number%10;
    }
    int findNthDigit(int n) {
        int digits=1;
        while(true)
        {
            long numbers=countOfIntegers(digits);
            if(n<numbers*digits)
                return digitAtIndex(n,digits);
            n-=digits*numbers;
            digits++;
        }
        return -1;
    }
};

复杂度分析:时间复杂度为O(logn),空间复杂度为O(1).

发布了115 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_22148493/article/details/105098254