剑指 Offer Java版

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

2019-07-29  本文已影响3人  孙强Jimmy

题目:数字以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;
}

复杂度分析

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

上一篇 下一篇

猜你喜欢

热点阅读