模拟法

自然数0,1,2,..,10,11,..,99,100,101,.., 可以根据自然数的位数(digitCount)划分为:

  • 区间1:0-9
  • 区间2:10-99
  • 区间3:100-999
  • ...

从小到大,进行计位递增模拟,确定n所在区间后,再结合该区间内自然数位数和n,即可确定对应数字。

# @param n int整型 
# @return int整型
#
class Solution:
    def findNthDigit(self , n: int) -> int:
        # 从小到大,找到位数n所在区间
        digitCount = 1
        lowLimit,highLimit = 0,10
        while True:
            interval = (highLimit-lowLimit)*digitCount
            # 判断是否在当前区间,若不是,则继续判断下一个区间;若是,则跳出循环
            if n > interval:
                n -= interval
                lowLimit = highLimit
                highLimit = highLimit*10
                digitCount += 1
            else:
                break
        # 确定该位置的数字属于哪个自然数
        number = lowLimit + int(n/digitCount)
        # 确定该位置的数字为自然数的第几位
        place = n%digitCount
        return int(str(number)[place])