Skip to main content

400.第N位数字

标签: math

难度: Medium

通过率: 35.25%

原题链接: https://leetcode.com/problems/nth-digit/description/

题目描述

给定一个整数 nn,返回无限整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中的第 nn 位数字。

解题思路

我们需要从由每个数字的所有排列组合形成的无限序列中找到第 nn 个数字。可以通过以下步骤实现:

  1. 确定数字的范围: 首先,在个位数的数字中,总共有 99 个数字(即 1199),共 9×1=99 \times 1 = 9 个数字位。对于两位数的数字,数字在 10109999 之间,共有 9090 个数字,因而共有 90×2=18090 \times 2 = 180 个数字位。
  2. 找到对应的位数: 我们逐步减少 nn,直到找到 nn 所落于的某个特定位数。
    • 如果 n9n \leq 9,则在前面 99 个数字中找到第 nn 个。
    • 如果不在上述范围内,递归地检查下一个更高位数的数字段。
  3. 定位具体的数字: 确定所在的数字位数后,计算出当前 nn 所在的具体数字int\text{int}。计算方法是:
    • 确定完整的数字个数:index=n1digit数目\text{index} = \lfloor \frac{n-1}{\text{digit数目}} \rfloor
    • 找出具体数字:从最低的数字开始加上刚才确定的索引得到完整数字。
  4. 提取最后结果: 通过 nn 在数字中的具体位置,提取指定的数字位。

代码实现

def findNthDigit(n):
# 数字开始由几位数组成
digit_length = 1
# 其范围内总共的数字位数
count = 9

# 找到第n个数字所在的位数区间
while n > digit_length * count:
n -= digit_length * count
digit_length += 1
count *= 10

# 确定实际的数字
start = 10 ** (digit_length - 1)
number = start + (n - 1) // digit_length

# 确定具体的位置并返回结果
digit_index = (n - 1) % digit_length
return int(str(number)[digit_index])

复杂度分析

时间复杂度:
O(d)O(d),其中 dd 为目标数字的位数。因为逐个减去全位数的数量直到找到所需位数。

空间复杂度:
O(1)O(1),因为仅用了少数变量进行计算的固定空间。