寻找最大数的逻辑简单,但如何对两数比较组成更大的整数是一个重点。例如示例2中如何区分3与30谁放在前面以及3与34谁放在前面是一个难点,本文通过采用functools中的自定义排序规则cmp_to_key()来判断上述情况,并给出代码实现。
示例:
图1 最大数输入输出示例
代码:
class Solution:def largestNumber(self, nums: List[int]) -> str:for i, num in enumerate(nums):nums[i] = str(num)def compare(n1, n2):if n1 + n2 > n2 + n1:return -1elif n1 + n2 < n2 + n1:return 1else:return 0nums = sorted(nums, key = cmp_to_key(compare))return str(int("".join(nums)))
解释:
1)题目为防止输出结果过大,要求输出字符串,于是先将数组元素转换为字符串:
for i, num in enumerate(nums):
nums[i] = str(num)
2)然后即对nums数组排序,排序方式通过functools中cmp_to_key()进行自定义,自定义函数即为cmp_to_key()的参数compare:
nums = sorted(nums, key = cmp_to_key(compare))
3)compare函数设置排序规则选择能组成更大整数的排序形式,返回-1为不变,返回1为相反。
def compare(n1, n2):
if n1 + n2 > n2 + n1:
return -1
elif n1 + n2 < n2 + n1:
return 1
else:
return 0
关于cmp_to_key()的用法和详细解释可见:
自定义排序规则:functools.cmp_to_key(callable)-CSDN博客