版权声明:Tian Run https://blog.csdn.net/u013908099/article/details/85795083
题目
输入数字n,按顺序打印出从1到最大的n位十进制数。
例:
输入3,则打印出1、2、3、…、999。
思路
- 直观的想法,打印1 ~ 10^n - 1
- 时间复杂度:O(10^n)
- 空间复杂度:O(1)
- 作者考虑到数字的位数限制,但这在Python中是不存在的。
假设存在位数限制,那么自然想到用列表来存储每一位数字。不采取字符串是因为Python中字符串是不可变对象,每次修改都会新生成一个字符串,显然会慢于原位修改的List。特别为了更快速的修改List,最好一开始就申请足够的List长度,append方法会倍增空间并将原列表复制过去,对于超长的列表将变慢。
每次打印并将列表最后一位 + 1,当出现10时,判断处理进位,当列表第一项出现进位时,则已经全部打印完成。- 时间复杂度:O(10^n)
- 空间复杂度:O(1)
- 作者为了代码的简洁,使用了递归的方法。从头向后修改列表,每次修改列表的时候,是否有有后一位允许修改,可以修改则调用修改其子数字。其递归式为
。
- 时间复杂度:O(10^n)
- 空间复杂度:O(n) 递归深度
代码
思路1:时间复杂度:O(10^n),空间复杂度:O(1)
def print_1_to_max_of_n_digit(n):
if n <= 0:
raise Exception('Invalid Input')
for i in range(1,10**n):
print(i)
return
思路2:时间复杂度:O(10^n),空间复杂度:O(1)
def list_print(num_in_list):
"""
print list sequentially
:param num_in_list: the list stores num in digits
:return: None
"""
start = False
for bit in num_in_list:
if bit:
start = True
if start:
print(bit, end='')
print()
return
def print_1_to_max_of_n_digit_list(n):
"""
:param n:num of digit
:return:None
"""
if n <= 0:
raise Exception('Invalid Input')
cur_num = [0] * n
while cur_num[0] < 10:
# 加10次
for i in range(10):
list_print(cur_num)
cur_num[-1] += 1
# 进位
for i in range(n-1, 0,-1):
if cur_num[i] >= 10:
cur_num[i] = 0
cur_num[i-1] += 1
else:
break
return
思路3:时间复杂度:O(10^n),空间复杂度:O(n)
def print_1_to_max_of_n_digit_list_recursively(n):
"""
:param n:num of digit
:return: None
"""
if n <= 0:
raise Exception('Invalid Input')
def recursive_print(d_i, cur_num, num_of_digit):
"""
:param d_i:index of modified digit
:param cur_num: current num
:param num_of_digit:limit of num of digit
:return: None
"""
if d_i == num_of_digit:
# end of recursive
list_print(cur_num)
return
for i in range(10):
cur_num[d_i] = i
recursive_print(d_i+1, cur_num, num_of_digit)
return
return recursive_print(0, [0] * n, n)
思考
在思路2卡了一会,其实挺简单的一个循环,一开始没有想明白结束的条件,光用for循环了。
思路3稍微卡了一下,但是对于这种递归的方法,只要想明白递归式,还是很清晰的。