美文网首页
打印从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)

相关文章

  • LeetCode 每日一题 [50] 打印从1到最大的n位数

    LeetCode 打印从1到最大的n位数 [简单] 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比...

  • LeetCode题解之打印从1到最大的n位数

    打印从1到最大的n位数 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印...

  • 面试题17. 打印从1到最大的n位数

    打印从1到最大的n位数 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印...

  • JZ-068-打印从 1 到最大的 n 位数

    打印从 1 到最大的 n 位数 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3...

  • 打印从1到最大的n位数

    《剑指offer》面试题17:打印从1到最大的n位数 题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如...

  • 打印从1到n最大n位数

    给定一个数字N,打印从1到最大的N位数。 输入 每个输入文件仅包含一组测试样例。 对于每个测试案例,输入一个数字N...

  • 打印从1到最大的n位数

    输入数字n,按照顺序打印从1到最大的n位十进制数。比如n=3,则打印1到999 最容易想到的是根据n求出最大的值是...

  • 打印从1到最大的n位数

    题目: 题目的理解: 受到先入为主的思想影响一直不明白题目表达的意思,直到看到列举才明白表达的是什么问题。深刻的理...

  • 打印从1到最大的n位数

    这是一个大数问题,字符串是表示大数的有效方法;用char类型表示十进制数字没有充分利用内存有一点浪费。 题目1: ...

  • 打印从1到最大的n位数

    题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数999。 ...

网友评论

      本文标题:打印从1到最大的n位数

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