劍指offer:數字序列中某一位的數字

題目描述
數字以0123456789101112131415…的格式序列化到一個字符序列中。在這個序列中,第5位(從0開始計數)是5,第13位是1,第19位是4,等等。請寫一個函數,求任意第n位對應的數字。git

# -*- coding: utf-8 -*-
# @Time         : 2019-07-09 22:51
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : digitAtIndex.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

def countOfDigit(digit):
    return 9 * 10 ** (digit - 1) if digit > 1 else 10

def findDigitWithinRange(digit, index):
    if digit == 1:
        number = 0
    else:
        number = 10 ** (digit - 1)
    number += index // digit
    remainder = index % digit
    return str(number)[remainder]

def digitAtIndex(index):
    """
    最直觀的作法就是從0開始遍歷全部整數,而後統計已經出現了多少位數字,直到直到所求下標的數字。這樣
    作的話效率過低。

    若是咱們能先肯定所求下標的數字是屬於幾位小數的,即先肯定答案位於三位數仍是四位數仍是五位數的數
    字中,而後再在這個位數段中肯定具體是哪一個數字,最後在這個數字中肯定是哪一位,這樣就能夠大大下降
    複雜度。
    """
    if index < 0:
        return -1
    # 所求的位置屬於幾位數,先從個位開始
    digit = 1
    while True:
        # 若是肯定了所求位置屬於幾位數了,就進一步求具體的數字
        if index <= countOfDigit(digit):
            return findDigitWithinRange(digit, index)
        # 不然跳過這個n位數
        index -= countOfDigit(digit) * digit
        digit += 1

def main():
    print(digitAtIndex(21))

if __name__ == '__main__':
    main()
相關文章
相關標籤/搜索