Offer 17. 打印从1到最大的n位数(大数越界-递归-DFS)

Offer 17. 打印从1到最大的n位数

一、当不考虑大数越界的情况(offer17)

思路:直接生成列表返回

复杂度: 时间复杂度 O(10^n)  空间复杂度O(1)

def printNumbers1(n):
    return [i for i in range(1, pow(10, n))]

二、当考虑大数越界的情况

思路:将生成的数字类型改为字符类型   每次固定高位求低位   递归来做(是一种深度优先遍历)

          如n=2时,       0 (0……9)     括号左边是十位  括号里是各位                      

                                  ……

                                  9(0……9)

复杂度: 时间复杂度 O(10^n)  空间复杂度O(10^n)

【PS】

     ⭐  "x".join(list1)  将list1种的字符元素用符号x连接起来

     ⭐  函数1内定义函数2  函数1中的变量对于函数2来说是全局变量     可以很好的存储元素  

def printNumbers2(n):
    def dps(x): # 传入的x代表固定的位  从高位开始固定  0 .... n-1
        if x == n:
            # 代表已经固定完一轮了
            res.append(''.join(num))
            return

        for i in range(10):     # 某位的取值遍历
            num[x] = str(i)     # 为该位赋值
            dps(x+1)            # 接着求低一位的值

    num = ['0'] * n  # 初始化临时的变量num
    res = []        # 最终返回的结果列表
    dps(0)          # 从0开始    当n=1时  调用递归函数一遍(x=0)   当n=2时  遍历两遍(x=0 1)
    return ','.join(res)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值