数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
0 <= n < 2^31
class Solution:
def findNthDigit(self, n: int) -> int:
# 个位为1,10位为2,依此类推
digit = 1
# 当前位数,数字的个数,
# 个位,0-9,位数是从下表0开始计数,则0-9,9是第9位
# 十位,10-99,一共是90*2,180个
# 百位:100-999,一共是900*3,2700个
# 可得到如下公式 9 * (10 ^digit -1)
# 比如 1001, 1001-9-180=812
# 812 < 2700 812 // 3 = 270,812%3=2,最后可得到 100+270=370,270的第二位,则第1001位既是7
nums = self.get_nums(digit)
while n >= nums:
# 说明第n位在当前位数的数字中
if n - nums < 0:
break
n = n - nums
digit += 1
nums = self.get_nums(digit)
# 离当前位数开始位置的第几个数字
cur_offset = n // digit
# 在最后那个数字的第几位
last_num_digit = n % digit
# 最后的数字
if digit > 1:
last_num = pow(10, digit - 1) + cur_offset
else:
# 个位数的时候,是从0开始计数的
last_num = 0 + cur_offset
# 举例子,10,是个10位数,一共有两位,第0位是0,和第1位是1,但是实际在字符序列中,十位在前,个数在后,所以需要通过digit - last_num_digit - 1得到实际的位数
return (last_num // pow(10, (digit - last_num_digit - 1)) )% 10
def get_nums(self, digit):
if digit == 1:
return 9 + 1
else:
return 9 * pow(10, digit - 1) * digit