Leetcode 400. 第N个数字
1 题目描述(Leetcode题目链接)
在无限的整数序列 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , ⋯ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, \cdots 1,2,3,4,5,6,7,8,9,10,11,⋯中找到第 n n n 个数字。注意: n n n 是正数且在32为整形范围内 ( n < 231 n < 231 n<231)。
输入:
3
输出:
3
输入:
11
输出:
0
说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
2 题解
本题的题目描述可能不是很清楚,可以把题目理解为无限的整数序列按顺序组成的一个长字符串中的第
n
n
n个字符,这样的话我们的输出结果应该是0到9这是个数字之一。
如果按照顺序一个一个查,这显然不是题目的本意。如果我们能够通过某种方法找到输入对应数字在哪个整数中,那我们就可以更方便地找到答案。因此观察:
[1,9]区间 1位数,一共有1*9=9个数字
[10,99]区间 2位数,一共有2*90=180个数字
[100,999]区间 3位数,一共有3*900=2700个数字
......
因此可以得到 i i i位数包含的数字个数为 i ∗ 9 ∗ 1 0 i − 1 i*9*10^{i-1} i∗9∗10i−1个,因此根据输入可以确定答案所在的数是几位数,以及是哪个数,再根据取余操作可以确定是这个数的第几个数字。
class Solution:
def findNthDigit(self, n: int) -> int:
i = 1
while True:
target = pow(10, i - 1)
if i*9*target >= n:
return int(str(target + (n-1)//i)[(n-1)%i])
n -= i*9*target
i += 1