题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印
n 为正整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
直接循环输出不是一个好办法,虽然可行但是如果数字太大在某些语言中可能会溢出。
替代的办法有用字符串代替数字,然后模拟加法计算。
更加简洁的办法是用递归,讲道理这个递归我看了挺长时间才看明白,需要学习的还很多啊。
基本上是根据《剑指offer》书上的代码写成了python。
index代表现在是在数字的哪一位(从高到低),如果index在最后一位,说明可以输出了。
不然的话在这一位循环0-9十个数字然后跳到下一位。
值得注意的是在主函数部分必须循环一遍。
然而这样的写法在python里面并不好看,因为在C/C++中可以用'0'+数字的方式把数字变成字符,另一方面,在C++中字符数组可以很容易转化成字符串。
class Solution:
def printNumbers(self, n: int) -> List[int]:
# return [i for i in range(1, int(math.pow(10 ,n)))]
self.n = n
self.num = [0]*n
self.ans = []
def recursive(index):
if index == self.n-1 :
printNum(self.num)
else:
for i in range(10):
self.num[index+1] = i
recursive(index+1)
# 将数组转换成数字
def printNum(nums):
start = -1
str_list = [str(i) for i in nums]
self.ans.append(int(''.join(str_list)))
# 在主程序中的循环
for i in range(10):
self.num[0] = i
recursive(0)
return self.ans[1:]
使用别的办法:
class Solution(object):
def printNumbers(self, n):
"""
:type n: int
:rtype: List[int]
"""
res = []
def get_num(s, bit, ind):
"""
:param s -> str: s是当前生成的字符串
:param bit -> int: bit是当前已经生成的位数
:param ind -> int: ind是第一个非零位的下标
"""
if bit == n:
# 排除0
if s[ind:] != '':
res.append(int(s[ind:]))
return
for i in range(10):
if ind == bit and i != 0 or ind < bit:
get_num(s + str(i), bit + 1, ind)
else:
get_num(s + str(i), bit + 1, ind + 1)
get_num('', 0, 0)
return res
作者:Lullaby
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/solution/17-pythonyi-xing-dai-ma-by-lullaby/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。`
总结
递归的使用。
在主循环部分还要再循环。