美文网首页剑指 Offer Java版
剑指Offer Java版 面试题44:数字序列中某一位的数字

剑指Offer Java版 面试题44:数字序列中某一位的数字

作者: 孙强Jimmy | 来源:发表于2019-07-29 21:39 被阅读3次

    题目:数字以0123456789101112131415···的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。

    参考答案

    public int digitAtIndex(int index) {
        if (index < 0) {
            return -1;
        }
        int digits = 1;
        while (true) {
            int numbers = countOfIntegers(digits);
            if (index < numbers * digits) {
                return digitAtIndex(index, digits);
            }
            index -= digits * numbers;
            digits++;
        }
    }
    
    private int countOfIntegers(int digits) {
        if (digits == 1) {
            return 10;
        }
        int count = 9;
        while (digits > 1) {
            count *= 10;
            digits--;
        }
        return count;
    }
    
    private int digitAtIndex(int index, int digits) {
        int number = 0;
        if (digits > 1) {
            number = 1;
            for (int i = 1; i < digits; i++) {
                number *= 10;
            }
        }
        number += index / digits;
        int indexFromRight = digits - index % digits;
        for (int i = 1; i < indexFromRight; i++) {
            number /= 10;
        }
        return number % 10;
    }
    

    复杂度分析

    • 时间复杂度:O(logn)。
    • 空间复杂度:O(1)。

    👉剑指Offer Java版目录
    👉剑指Offer Java版专题

    相关文章

      网友评论

        本文标题:剑指Offer Java版 面试题44:数字序列中某一位的数字

        本文链接:https://www.haomeiwen.com/subject/zdzirctx.html