题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数999。
这里需要考虑大数问题,最常用也是最容易的解决办法是用字符串或者数组表示大数。
解决这个问题有两点:1. 用字符串来模拟加法 2. 把字符串表达的数字打印
这个问题的实现方式需要迭代输出,迭代有终止的条件,因为是字符串,首先想到的是,当输出变量为'999...9'的时候,进行比较操作,可以终止迭代,但是字符串的比较的时间复杂度为O(n),所以这不是最优解法;
我们注意到只有对'999...9'加1的时候,才会在第一个字符(下标为0)的基础上产生进位,而其他所有情况都不会在第一个字符上产生进位。通过这个判断,来决定终止迭代的时机。
class Solution:
def print_max_of_n_digits(self, n):
if n <= 0:
return
# 字符串为不可变对象,这里使用列表
ret = [0 for _ in range(n)]
while True:
if self.increment(ret):
break
else:
self.do_print(ret)
return
def increment(self, ret):
is_over_flow = False
length = len(ret)
for i in range(length-1, -1, -1):
num = ret[i]
num += 1
if num >= 10:
if i == 0:
is_over_flow = True
else:
num -= 10
ret[i] = num
else:
ret[i] = num
break
return is_over_flow
def do_print(self, ret):
'''只是单纯的过滤前排的0,会不小心把数字中的0也过滤掉'''
begin_zero = True
length = len(ret)
for i in range(length):
if begin_zero and ret[i] != 0:
begin_zero = False
if not begin_zero:
print(ret[i], end='')
print('', end='\t')
把问题转换成数字排列的解法,递归让代码更简洁
class Solution:
def print_max_of_n_digits(self, n):
if n <= 0:
return
ret = [0 for _ in range(n)]
for i in range(10):
ret[0] = i
self.print_to_max_recursively(ret, n, 1)
def do_print(self, ret):
'''只是单纯的过滤前排的0,会不小心把数字中的0也过滤掉'''
begin_zero = True
length = len(ret)
for i in range(length):
if begin_zero and ret[i] != 0:
begin_zero = False
if not begin_zero:
print(ret[i], end='')
print('', end='\t')
def print_to_max_recursively(self, ret, length, index):
if index == length:
self.do_print(ret)
return
for i in range(10):
ret[index] = i
self.print_to_max_recursively(ret, length, index+1)