剑指Offer17-打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
-
用返回一个整数列表来代替打印
-
n 为正整数
来源:力扣(LeetCode)
链接:力扣
一解
class Solution:
def printNumbers(self, n: int) -> List[int]:
return [i for i in range(1, 10**n)]
使用一行搞定,但存在重大问题,如果数字 n 无限大,一解
在其它语言会越界(比如 Java),可以使用字符串替代数字。
二解
-
digit
表示要生成的数字的位数,从1
开始到n
位 -
数字开头不能是
0
,要单独处理首位first
,其范围是1~9
-
使用递归生成除首位,剩下的位数
digit-1
-
递归中止条件是
已生成的位数==目标位数
,即index == digit
class Solution:
def printNumbers(self, n: int) -> List[int]:
def dfs(index, num, digit):
# 已生成位数 == 目标位数
if index == digit:
res.append(int(''.join(num)))
return
# 生成除首位的其它位
for i in range(10):
# 递归追加一个数字到 res
num.append(str(i))
dfs(index + 1, num, digit)
# 将已追加的数字弹出,继续追加其它数字
num.pop()
res = []
for digit in range(1, n + 1):
# 首位数字单独处理
for first in range(1, 10):
num = [str(first)]
dfs(1, num, digit)
return res