【剑指offer】17.打印从1到最大的n位数
时间:2023-07-20 14:37:00
Python3
假设 n = 1 n=1 n=1,打印 [ 1 , 2 , . . . , 9 ] [1,2,...,9] [1,2,...,9]
假设 n = 2 n=2 n=2,打印 [ 1 , 2 , . . . , 99 ] [1,2,...,99] [1,2,...,99]
假设 n = 3 n=3 n=3,打印 [ 1 , 2 , . . . , 999 ] [1,2,...,999] [1,2,...,999]
…
以此类推
最大的数字 m a x max max与 n n n之间的关系为 m a x = 1 0 n − 1 max=10^n-1 max=10n−1
根据题意,可写如下代码:
class Solution:
def printNumbers(self, n: int) -> List[int]:
return [num for num in range(1, 10**n)]
提交之后,顺利通过。
看了评论区,说这题的本意是考察大数问题。上面的写法没有考虑大数(即大于int
类型能表示的最大数),但实际上List[int]
已经表达了输出的数字是int
类型,因此实际上不必考虑大数。
如果非要考虑大数,那本题的写法如下:(参考https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/solution/jian-zhi-offer-17-da-yin-cong-1dao-zui-d-ngm4/)
class Solution:
def printNumbers(self, n: int) -> List[int]:
# 数字的全排列问题,使用深度优先搜索解决
def dfs(index, num, digit): # index表示当前在第几位,num表示存储数字各位上数值的列表,digit表示当前的数字共有几位
if index == digit: # 当前位数与digit相等,说明数字填充好了
res.append(int(''.join(num)))
return
for i in range(10): # 否则,填充下一位上的数值
num.append(str(i))
dfs(index + 1, num, digit)
num.pop()
res = [] # res用于存储待打印的整数列表
for digit in range(1, n + 1): # digit表示数字的位数,如数字9有1位,数字99有2位,数字999有3位等等
for first in range(1, 10): # 数字的首位,首位的取值范围是[1,10)
num = [str(first)] # num用于保存数字各位上的数值
dfs(1, num, digit)
return res # 返回整数列表
时间复杂度分析:
递归生成全排列的数量为 1 0 n 10^n 10n,因此时间复杂度为 O ( 1 0 n ) O(10^n) O(10n)。