剑指 Offer 17. 打印从1到最大的n位数
输入数字
n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
❤❤❤大数打印解法——递归分治
思路
不管是任何数字类型,short,long,int
均有表示范围,故大数打印仅能通过String
实现。
-
算法-递归
基于分治思想,先固定高位,在固定低位,当个位被固定时,添加数字的字符串。
def printNumbers(self,n:int) -> [int]:
def dfs(x):
if(x==n):
res.append(''.join(num))
for i in range(10):
num[x] =str(i)
def(x+1)
num = ['0']*n
res=[]
dfs(0)
return ','.join(res)
# 缺点
# 高位0未删除
# 次方法从0开始
解决方法
- 删除高位0
- 定义左边界
start
,以保证num[start:]
中无高位多余的0。例如n=2时,1-9时,start
=1;10-99时,start=0,显然当当前位数全为9时,start需要往前进一位(0是高位),即减一 - 假设当前num中9的个数为
nine
,则当start==n-nine
时,start--
- 定义左边界
- 删除初始数0,仅需在传入数组前加一个判断即可。
- 删除高位0
class Solution:
def printNumbers(self, n: int) -> [int]:
def dfs(x):
if x == n:
s = ''.join(num[self.start:])
if s != '0': res.append(s)
if n - self.start == self.nine: self.start -= 1
return
for i in range(10):
if i == 9: self.nine += 1
num[x] = str(i)
dfs(x + 1)
self.nine -= 1
num, res = ['0'] * n, []
self.nine = 0
self.start = n - 1
dfs(0)
return ','.join(res)
复杂度分析
- 时间复杂度:
- 空间复杂度: