美文网首页剑指 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