找规律题目。先找第几个数字,再从中取字符。

  • digit代表这一段数字的位数(1-9是1位,10-99是两位…)
  • times代表的是当前位数对应的数量级(10, 100, 1000…)
  • count代表的是当前位数、当前数量级的字符总数(比如1位的有9*1个,2位的有90*2个…)
  • 先递推从n上减去每个数量级的数字总数直到剩下的n已经无法容纳下一级的字符总数,那么剩下的n就是介于两级之间了。用当前字符数的数量基数times加上n-1整除当前区段的位数就可以定位到是第几个数字了。
  • 把这个数字变成字符串,n-1digit的余数作为index,即可得到答案。

代码:

1
2
3
4
5
6
7
8
9
10
11
def findNthDigit(self, n: int) -> int:
digit = 1
times = 1
count = 9
while n > count:
n -= count
digit += 1
times *= 10
count = 9 * digit * times
res = times + (n-1) // digit
return int(str(res)[(n-1) % digit])