剑指 Offer 17. 打印从1到最大的n位数

https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

思路:这道题应该主要是考大数问题,用字符串模拟加法。但是leetcode上这道题没什么意义,直接写也能过

    def printNumbers(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        return range(1, 10 ** n)
class Solution(object):
    def printNumbers(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        max = 0
        for i in range(0, n):
            max += 9 * pow(10, i)     #  尝试了max = int("9" * n) 效率没有这个高
        result = list()
        i = 1
        while i <= max:
            result.append(i)
            i = i + 1
        return result

在这里插入图片描述


考虑大数问题

  1. 用string模拟数值进行运算,需要模拟两部分 1. 用string模拟数值加法 2. 用string比较代替数值大小比较
    加法部分思路参考 https://blog.csdn.net/weixin_42219542/article/details/113769802
class Solution(object):
    def sum(self, a, b):
        # 不考虑性能,就考虑通用性,这里写一个实现string相加的功能
        result = ""
        result_list = list()
        remain = 0
        i = 1
        while i <= len(a) and i <= len(b):
            sum = int(a[-i]) + int(b[-i]) + remain
            tmp = sum % 10
            remain = sum / 10
            result_list.append(tmp)
            i += 1
        while i <= len(a):
            sum = int(a[-i]) + remain
            tmp = sum % 10
            remain = sum / 10
            result_list.append(tmp)
            i += 1
        while i <= len(b):
            sum = int(b[-i]) + remain
            tmp = sum % 10
            remain = sum / 10
            result_list.append(tmp)
            i += 1
        if remain != 0:
            result_list.append(remain)
        i = 1
        while i <= len(result_list):
            result += str(result_list[-i])
            i += 1
        return result
    def printNumbers(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        max = ""
        for i in range(0, n):
            max += "9"
        # print max
        result = list()
        i = "0" * n 
        # print i
        while i <= max and len(i) <= len(max):
            if i.lstrip('0') == "":
            	# 过滤掉初始化的0
                i = self.sum(i, "1")
                continue
            result.append(int(i.lstrip('0')))
            # 字符串加法
            i = self.sum(i, "1")
            # print i
        return result

在这里插入图片描述
2. 全排列法
思路:考虑每个位置的数字都有0-9 10种可能。
初始化n位0字符串,固定高位,向低位递归。
在调试台没问题,但是提交上去不行,很神奇

class Solution(object):
    result_list = list()
    
    def addNumbers(self, k, result, result_list, n):
        if k >= n:
            tmp = ''.join(result)    # 这里要是完全考虑大数,就用rstrip去掉开始多余的0,因为这道题输出是int,直接用int函数,就不用去掉开始的0了
            if int(tmp) != 0:
                self.result_list.append(int(tmp))
            return
        for i in range(0, 10):
            result[k] = str(i)
            self.addNumbers(k+1, result, self.result_list, n)
        return
    def printNumbers(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        result = [0] * n 
        self.addNumbers(0, result, self.result_list, n)
        return self.result_list

在这里插入图片描述
不知道为什么。。。。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值