Python多字段排序函数——cmp_to_key()【LeetCode50天刷题计划寒假特别版(Day 1 — 最大数(11.40-12.20)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

python标准模块functools中的cmp_to_key可以将一个cmp函数变成一个key函数,从而支持自定义排序

使用方法

假设现在有一个需要排序的列表lst
首先定义一个cmp(a,b),实现a和b的比较规则,如果a>b,返回1,a<b返回-1,相等返回0

然后调用cmp_to_key函数将functools.cmp_to_key(cmp)作为lst的sort方法的key参数:
注意全序关系下,>表示升序,如果需要逆序reverse=True即可,(也可以灵活修改cmp的定义

lst.sort(key=functools.cmp_to_key(cmp))

这样就可以完成对lst的自定义排序。下面是一个leetcode例题

例子

一、题目

最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例

示例 1:
输入:nums = [10,2]
输出:“210”

示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”

提示

1 <= nums.length <= 100
0 <= nums[i] <= 109

二、思路

有数字 a,b , 如果 (a + b) 组成的字符串 > (b + a) 组成的字符串,则 a 一定排在 b 的前面(全序关系);
数组中的数字都满足上面的排序规则,先对数组进行排序(用到Python多字段排序函数cmp_to_key),然后拼接输出结果;
需要注意,如果nums元素为全0,最后结果是0的字符串,因此最后可以转为int再转为str输出

三、代码

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        
        nums=[str(x) for x in nums] #数字变为字符串
        #定义cmp函数
        def cmp(a,b):
            if(int(a+b) > int(b+a)):
                return 1
            elif(int(a+b) == int(b+a)):
                return 0
            else:
                return -1
        #调用库函数排序
        nums.sort(key=functools.cmp_to_key(cmp),reverse=True)
        return str(int(''.join(nums)))
        

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值