📜  门|门CS 2008 |第 46 题(1)

📅  最后修改于: 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)。