JZ17 大数的打印 打印从1到最大的n位数字


前言

  是本篇博客主要记录剑指offer中的第17题的一些想法,虽然是一道简单题,用一个双循环就OK,但在以前刷C语言的习题中碰到过,不过那时需要使用字符串去拼数字,因而就当复习了,再次温习一下 字符拼数字的感觉!


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

  输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。(这里考虑更大的数字 例如输入10,11等)

  来源:力扣(LeetCode)
  链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/

二、解题思路及代码

1.解题思路

  首先把n=1的情况给列出来,工作量不大
(1)res = [1,2,3,4,5,6,7,8,9];
(2)考虑一下,当n=2时,是不是取出res中的每个元素,在其后面 ‘ + ’ 0~9 的数字?
(3)再说当n=3时,是不是就是在n=2的基础上,取出对应的元素,如 10 转化成字符型 + 0~9 的数字;如此往复,我想出充分利用res的一种方法,如下图所示:

  图1 数字拼接 + 列表尾部续接
在这里插入图片描述

2.程序及注释

代码如下(示例):

class Solution:
    def printNumbers(self, n: int) -> List[int]:
        #一行代码 显然不能解决大数的问题 
        #return [i+1 for i in range(10**n-1)]

        #来扩充一下 使用字符串搞一搞
        #首先,确定首字母只能为1~9 再者确定首字母后面的位数 每一位上0~9
        
        def dfs(digit: int) -> list[int]:
            #这里的 or ' 0 ' 是为了防止(digit-2=0 情况的出现
            #确定上一次的数组索引范围
            for i in res[int('9'*(digit-2) or '0'):int('9'*(digit-1))]:
                for j in range(10):
                	#尾部 追加
                    res.append(int(str(i)+str(j)))
        
        #设定全局变量
        res = [1,2,3,4,5,6,7,8,9]
        #确定总位数
        if n == 1: return res
        else:
            for digit in range(2,n+1):
                #生成位数为i的首字母为head的一组数字
                    lis = dfs(digit)
        return res

  

三、总结

  这道题的代码想了好久,虽然代码没有几十行,但许多细节必须注意到,这次代码的调试,充分用到了前段时间学习的一些语法知识,受益匪浅啊!不过,这次的代码仅作为参考,试了一下用时还是很不乐观的,毕竟用到了三个循环。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值