剑指 Offer 44. 数字序列中某一位的数字
大约 1 分钟
剑指 Offer 44. 数字序列中某一位的数字
- 标签:数学、二分查找
- 难度:中等
题目链接
题目大意
数字以 0123456789101112131415…
的格式序列化到一个字符序列中。在这个序列中,第 5
位(从下标 0
开始计数)是 5
,第 13
位是 1
,第 19
位是 4
,等等。
要求:返回任意第 n
位对应的数字。
解题思路
根据题意中的字符串,找数学规律:
123456789
:是9
个1
位数字。10111213...9899
:是90
个2
位数字。100...999
:是900
个3
位数字。1000...9999
是9000
个4
位数字。我们可以先找到对应的数字对应的位数
digits
。然后找到该位数
digits
的起始数字start
。再计算出
n
所在的数字number
。number
等于从起始数字start
开始的第 个数字。即number = start + (n - 1) // digits
。然后确定
n
对应的是数字number
中的哪一位。即idx = (n - 1) % digits
。最后返回结果。
代码
class Solution:
def findNthDigit(self, n: int) -> int:
digits = 1
start = 1
base = 9
while n > base:
n -= base
digits += 1
start *= 10
base = start * digits * 9
number = start + (n - 1) // digits
idx = (n - 1) % digits
return int(str(number)[idx])