题目
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:输入:n = 11
输出:0限制:
0 <= n < 2^31
思路
找规律:
当给定一个数n时,先判断它对应几位数。例如0~9对应个位数; 10~189对应两位数,190~2889对应3位数; 其中的关键数字[9,189,2889]可以通过for循环创建;
判断出几位数后,再判断n对应的是哪个整数N的哪一位p。只需要将n中剩余的位数取余即可;
这样,返回整数N的第p位,即为所求。
具体见代码。
代码
class Solution:
def findNthDigit(self, n: int) -> int:
if n <= 9:
return n
# 创建索引列表
index_list = [9]
for i in range(2,11):
new_item = i*9*(10**(i-1))
index_list.append(index_list[-1]+new_item)
# 得到index_list[9, 189, 2889, ... ,8888888889]
# 找到n对应的是第几位数? [digit] 在第digit位数中尚余了[remaining]位
for i in range(10):
if index_list[i] > n:
digit = i + 1
remaining = n - index_list[i-1]
break
# 确定n对应的是整数N的第p位
N, p = divmod(remaining,digit)
if p != 0: # 有余数,则需要加1,否则不需要+1
N = N + 1
# 用幂来确定第N个digit位整数intN的第p位是多少
intN = 10**(digit-1) + (N-1)
return int(str(intN)[p-1])
复杂度分析
时间复杂度O(1);