美文网首页
打印从1到最大的n位数

打印从1到最大的n位数

作者: 二十岁的弹簧 | 来源:发表于2018-12-18 10:10 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/rlskkqtx.html