剑指 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']*nres=[]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 -= 1returnfor i in range(10):if i == 9: self.nine += 1num[x] = str(i)dfs(x + 1)self.nine -= 1num, res = ['0'] * n, []self.nine = 0self.start = n - 1dfs(0)return ','.join(res)
复杂度分析
- 时间复杂度:
- 空间复杂度:
