[剑指Offer] 17_打印从1到最大的n位数

题目

输入数字n,按顺序打印出从1到最大的n位十进制数。

例:

输入3,则打印出1、2、3、…、999。


思路

  1. 直观的想法,打印1 ~ 10^n - 1
    1. 时间复杂度:O(10^n)
    2. 空间复杂度:O(1)
  2. 作者考虑到数字的位数限制,但这在Python中是不存在的。
    假设存在位数限制,那么自然想到用列表来存储每一位数字。不采取字符串是因为Python中字符串是不可变对象,每次修改都会新生成一个字符串,显然会慢于原位修改的List。特别为了更快速的修改List,最好一开始就申请足够的List长度,append方法会倍增空间并将原列表复制过去,对于超长的列表将变慢。
    每次打印并将列表最后一位 + 1,当出现10时,判断处理进位,当列表第一项出现进位时,则已经全部打印完成。
    1. 时间复杂度:O(10^n)
    2. 空间复杂度:O(1)
  3. 作者为了代码的简洁,使用了递归的方法。从头向后修改列表,每次修改列表的时候,是否有有后一位允许修改,可以修改则调用修改其子数字。其递归式为 T ( n ) = Σ i = 0 9 ( i + T ( n − 1 ) ) T(n) = \Sigma_{i=0}^9 (i+T(n-1)) T(n)=Σi=09(i+T(n1))
    1. 时间复杂度:O(10^n)
    2. 空间复杂度: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稍微卡了一下,但是对于这种递归的方法,只要想明白递归式,还是很清晰的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值