首先,这个问题的关键在于理解数字序列的组织形式。数字序列以0开始,依次增长。根据数字的位数,这些数字可以分为不同的组,例如1位数(0-9)、2位数(10-99)、3位数(100-999)等。每组内的数字位数是固定的。\n\n为了找到第n位的数字,我们首先需要确定这个数字位于哪一组中。这是通过逐步减去每组中的位数来实现的,直到找到包含第n位的那个组。在代码中,变量`digit`表示当前组中每个数字的位数,`start`表示当前组的起始数字,`count`表示当前组中全部字符的总数。\n\n一旦确定了数字所在的组,我们再计算它是这个组中的第几个数字,以及是这个数字的第几位。这是通过对`start`进行偏移和使用模运算来确定的。最后,将数字转换为字符串并获取正确的字符,将其转换为整数即为答案。
时间复杂度: O(1)
空间复杂度: O(1)
class Solution:
def findNthDigit(self, n: int) -> int:
digit, start, count = 1, 1, 9 # 初始化位数为1,起始数字为1,当前位数组的字符总数为9
while n > count: # 当n大于当前位数组的字符总数时,需要跳至下一位数组
n -= count # 减去当前位数组的字符总数,更新n为剩余的位置数
start *= 10 # 更新起始数字到下一个位数组的起始
digit += 1 # 数字位数加1
count = 9 * start * digit # 更新当前位数组的字符总数
num = start + (n - 1) // digit # 确定n所在的完整数字
return int(str(num)[(n - 1) % digit]) # 返回n所在数字的具体某一位