題目描述
數字以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()