剑指 Offer 45. 把数组排成最小的数

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [3,30,34,5,9]
输出: “3033459”

知识点:

Python字符串可以作比较,比较方法是比较首位ascII码,若首位相同,则比较下一位。

方法:
此题本质上也是排序问题,找到数组的正确排序,关键点就是下面红色部分:

  1. 先将数组中元素转化成字符串a = [‘3’, ‘30’, ‘34’, ‘5’, ‘9’]
  2. (此时就为两个字符串比较,其比较原则符合本题所需)若 nums[i] + nums[j] < nums[j] + nums[i] ,则证明nums[i] 应在nums[j] 左面
  3. 每次在nums中找到最左的数,存入OUT中,并删除nums中的此数。
  4. 循环步骤3过程直至a中为空
  5. 将OUT转化为字符串输出

Python代码

class Solution:
    def minNumber(self, nums: List[int]) -> str:
        a = []
        OUT = []
        for i in nums:
            a.append('%d' % i)
        while a:
            num_min = 0
            for j in range(1, len(a)):
                if a[num_min] + a[j] > a[j] + a[num_min]:
                    num_min = j
            OUT.append(a[num_min])
            del a[num_min]
        return ''.join(OUT)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值