与其他题解都不一样的排序方法--剑指 Offer 45. 把数组排成最小的数

剑指 Offer 45. 把数组排成最小的数
题目要求:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

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

题解的一般排序方法: 使用自定义排序

  • 若拼接字符串 x + y > y + x,则 x “大于” y ;
  • 反之,若 x + y < y + x ,则 x “小于” y .

这里提出另外一种排序的方法:

  • 对于两个字符串,如果长度相等,(如34和52)从头开始每一位进行比较,则很容易得到34要排在52之前;
  • 对于长度不相等的字符串,则需要将长度小的字符串进行重复,并且从头开始比较(如883和88重复为883和8888),则可以得到88要排在883之前;
  • 对于重复后比较不了的,就继续重复,重复至可以比较为止(使用递归)

接下来放代码:

class Solution:
    def minNumber(self, nums: List[int]) -> str:
        def sort_rule(x, y):
            if len(x) == len(y):
                if x > y: return 1
                elif x < y: return -1
                else: return 0
            else:
                if len(x) <= len(y):
                    while len(x) < len(y):
                        x += x
                else:
                    while len(x) > len(y):    
                        y += y
                for i in range(min(len(x),len(y))):
                    if x[i] > y[i]: return 1
                    elif x[i] < y[i]: return -1
                    else: continue
            return sort_rule(x,y)
        
        strs = [str(num) for num in nums]
        strs.sort(key = cmp_to_key(sort_rule))

        return ''.join(strs)

不是最快的解法,提供一个与题解不一样的思路。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值