剑指Offer 17. 【大数打印】打印从 1 到最大的 n 位数(Easy)

在这里插入图片描述
【题目链接】

题解

  1. 打印从 1 到最大的 n 位数(分治算法 / 全排列,清晰图解)

思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

class Solution:
    ### 1208 不考虑大数问题(44 ms,19.3 MB)
    def printNumbers(self, n: int) -> List[int]:
        return list(range(1, 10**n))

    ### 1208 考虑大数问题(132 ms,19.5 MB)
    def printNumbers(self, n: int) -> List[int]:
        def dfs(x):
            # 每一个字符串数的长度是否已经达到n位数
            if x == n:
                s = ''.join(num[self.start_idx:]) # 从有效下标开始读取字符串数
                if s != '0': res.append(int(s))   # '0'不应该存在于数组中
                
                # 若当前数段已经被遍历完,则需要进位(即有效下标多一位)
                if n - self.start_idx == self.nine: self.start_idx -= 1

                # 注意:当前字符串数计算完成,需返回计算下一个字符串数!
                return

            # 每一位从0到9进行循环遍历
            for i in range(10):
                if i == 9: self.nine += 1 # 若出现9,则进位累计器加一
                num[x] = str(i)           # 保存当前位的字符串值
                dfs(x + 1)                # 遍历下一位

            # 每当有效数位多一位,则之前的进位累计器减一,重新累计当前数段的进位累计器
            self.nine -= 1

        # 初始化num长度为n位数的长度
        num, res = ['0'] * n, []

        # 初始化有效下标为n - 1(即从个位数开始),进位累计器为0(表示初始时不需要进位)
        self.start_idx, self.nine = n - 1, 0

        dfs(0) # 从0(即第一位)开始生成字符串数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值