题解
思路
代码
class Solution:
### 1208 不考虑大数问题(44 ms,19.3 MB)
def printNumbers(self, n: int) -> List[int]:
return list(range(1, 10**n))
### 1208 考虑大数问题(132 ms,19.5 MB)
def printNumbers(self, n: int) -> List[int]:
def dfs(x):
# 每一个字符串数的长度是否已经达到n位数
if x == n:
s = ''.join(num[self.start_idx:]) # 从有效下标开始读取字符串数
if s != '0': res.append(int(s)) # '0'不应该存在于数组中
# 若当前数段已经被遍历完,则需要进位(即有效下标多一位)
if n - self.start_idx == self.nine: self.start_idx -= 1
# 注意:当前字符串数计算完成,需返回计算下一个字符串数!
return
# 每一位从0到9进行循环遍历
for i in range(10):
if i == 9: self.nine += 1 # 若出现9,则进位累计器加一
num[x] = str(i) # 保存当前位的字符串值
dfs(x + 1) # 遍历下一位
# 每当有效数位多一位,则之前的进位累计器减一,重新累计当前数段的进位累计器
self.nine -= 1
# 初始化num长度为n位数的长度
num, res = ['0'] * n, []
# 初始化有效下标为n - 1(即从个位数开始),进位累计器为0(表示初始时不需要进位)
self.start_idx, self.nine = n - 1, 0
dfs(0) # 从0(即第一位)开始生成字符串数
return res