前言
是本篇博客主要记录剑指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
三、总结
这道题的代码想了好久,虽然代码没有几十行,但许多细节必须注意到,这次代码的调试,充分用到了前段时间学习的一些语法知识,受益匪浅啊!不过,这次的代码仅作为参考,试了一下用时还是很不乐观的,毕竟用到了三个循环。