打印从1到最大的n位数
【题目】:
输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3,则打印1,2,3,…,999。
【解体思路】:
- 这个题目需要考虑大数的问题,使用字符串来表示这个数字,然后在字符串上模拟加法。
- 还可以使用递归方法,将问题转化成数字的全排列。
示例代码1:
def func(n):
if n <= 0:
return
number = [0] * n
while True:
carry = 0
for i in range(n - 1, -1, -1):
if i == n - 1:
isum = number[1] + 1
if isum == 10:
if i == 0:
return
carry = 1
number[i] = 0
else:
carry = 0
number[i] = isum
else:
if carry == 1:
isum = number[i] + carry
if isum == 10:
if i == 0:
return
carry = 1
number[i] = 0
else:
carry = 0
number[i] = isum
else:
break
print_number(number)
def print_number(number):
for i in range(len(number)):
if number[i] != 0:
break
if i == len(number) - 1 and number[i] == 0:
return
res = "".join(str(j) for j in number[i:])
print(res, end=" ")
func(2)
运行结果:
示例代码2:
class Solution(object):
def printNumbers(self, n):
"""
:type n: int
:rtype: List[int]
"""
return [i for i in range(1, 10**n)]
示例代码3:
class Solution:
def printNumbers(self, n: int) -> [int]:
def dfs(x):
if x == n: # 终止条件:已固定完所有位
res.append(''.join(num)) # 拼接 num 并添加至 res 尾部
return
for i in range(10): # 遍历 0 - 9
num[x] = str(i) # 固定第 x 位为 i
dfs(x + 1) # 开启固定第 x + 1 位
num = ['0'] * n # 起始数字定义为 n 个 0 组成的字符列表
res = [] # 数字字符串列表
dfs(0) # 开启全排列递归
return ','.join(res) # 拼接所有数字字符串,使用逗号隔开,并返回
class Solution(object):
def printNumbers(self, n):
"""
:type n: int
:rtype: List[int]
"""
def dfs(x):
if x == n:
s = ''.join(nums[self.start:])
if s != '0':
res.append(int(s))
if n - self.start == self.nine:
self.start -= 1
return
for i in range(10):
if i == 9:
self.nine += 1
nums[x] = str(i)
dfs(x+1)
self.nine -= 1
nums = ['0'] * n
res = []
self.start = n - 1
self.nine = 0
dfs(0)
return res