📅  最后修改于: 2023-12-03 14:58:36.736000             🧑  作者: Mango
这道题是ACM/ICPC的一道题目,属于门杂项中的一道题目。题目名称为“门|门CS 2008 |第 46 题”。题目难度属于简单(初学者可以一试)。
给定一个非负整数列表,我们需要把它们排列在一起使得它们形成一个最大的整数。
例如,给出列表 [10,2],我们应当能够得到以下两个整数:102 和 210。其中更大的整数是 210。
这道题目需要把一个列表中的数拼接成一个数,然后比较大小。但是直接比较是不行的,例如[3, 30, 34, 5, 9],如果直接把它们拼接起来,得到的结果是:3303459 和 5330349。而正确的结果应该是5330349。
因此,我们需要自定义一种比较方式。我们把两个数连起来,比较大小。比如 a 和 b,如果 a + b > b + a,则 a 排在 b 前面,否则 b 排在 a 前面。
class Solution:
def largestNumber(self, nums: List[int]) -> str:
def compare(a, b):
if a + b > b + a:
return -1
else:
return 1
nums = list(map(str, nums))
nums.sort(key=functools.cmp_to_key(compare))
ans = ''.join(nums).lstrip('0')
return ans or '0'
其中,functools.cmp_to_key() 可以将一个比较函数转化为 key 函数,使得 sorted() 函数可以使用该函数。
由于程序中使用了排序,时间复杂度为 O(nlogn)。