打印从1到最大的n位数

题目:输入数字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)

你可能感兴趣的:(打印从1到最大的n位数)