题目:
给定一组非负整数
nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
示例:
示例 1:
输入:nums = [10, 2]
输出:"210"
示例 2:输入:nums = [3, 30, 34, 5, 9]
输出:"9534330"
解法:
自定义排序规则。
知识点:
1.sorted(iterable, cmp=None, key=None, reverse=False):此语法针对Python2,在Python3中,cmp参数被移除,需要在key的地方传入functools.cmp_to_key函数。根据sorted的机制,cmp传入之后,会根据传入的自定义函数排序,类似于冒泡排序。自定义函数需要指定x1 < x2时,返回-1,x1 > x2时,返回1,x1 == x2时,返回0,最后根据规则返回升序结果。例如,传入的自定义函数如下:
def cmp(x1, x2):if str(x1) + str(x2) > str(x2) + str(x1):return 1elif str(x1) + str(x2) < str(x2) + str(x1):return -1else:return 0将两数以字符串形式拼接比较大小,最后将以升序形式返回拼接结果最大的列表,将列表中每个数连起来就是结果。排序做的相当于两两比较str(x1) + str(x2)和str(x2) + str(x1)的关系,将小的放前面,大的放后面。
2.functools.cmp_to_key(callable):将比较函数转化为关键字函数。callable是函数名。传入的函数接受2个参数,比较这2个参数,例如:x,y, 当x > y时返回1;小于时返回-1;否则返回0。
代码:
from functools import cmp_to_keyclass Solution:def largestNumber(self, nums: List[int]) -> str:def cmp(x1, x2):if str(x1) + str(x2) > str(x2) + str(x1):return 1elif str(x1) + str(x2) < str(x2) + str(x1):return -1else:return 0nums.sort(key=cmp_to_key(cmp), reverse=True)return str(int(''.join(map(str, nums))))