提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 使用方法
- 例子
- 一、题目
- 最大数
- 示例
- 提示
- 二、思路
- 三、代码
前言
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)))