给定一组非负整数,从新排列它们的顺序使之组成一个最大的整数。python
示例 1:函数
输入: [10,2] 输出: 210
示例 2:测试
输入: [3,30,34,5,9] 输出: 9534330
说明: 输出结果可能很是大,因此你须要返回一个字符串而不是整数。code
这道题目很是有意思。读完题以后,咱们能够获得一个初步的方案:因为不管怎么排,最佳的方案确定是会把全部的数字所有用上。因此,若是字典序越大的,获得的数值也会越大。只须要尽量的让字典序大的数字处于尽量高的位置便可。那么一个初步的实现方案以下排序
class Solution: def largestNumber(self, nums): """ :type nums: List[int] :rtype: str """ result = ''.join(sorted(map(str, nums), reverse=True)) return result
看起来不错,可是却没法经过该题的全部测试。下面给出一个反例,['30', '3'],排序以后获得的是’303‘而不是’330‘。受此启发,咱们假设有两个字符串a,b。咱们只要判断a+b大仍是b+a大,大的排在前面便可。那么刚刚咱们的反例能够顺利经过了。ip
因而,一个能够经过全部测试样例的代码便有了文档
from functools import cmp_to_key def cmp(a, b): if a + b > b + a: return 1 elif a + b < b + a: return -1 else: return 0 class Solution: def largestNumber(self, nums): """ :type nums: List[int] :rtype: str """ result = ''.join(sorted(map(str, nums), key=cmp_to_key(cmp), reverse=True)) return result[:-1].lstrip('0') + result[-1]
这里涉及到了Python3 sorted函数自定义比较函数的知识点,在Python3中,sorted方法撤销掉了原有的cmp参数,因此要进行这样的排序操做更加复杂了。有关此知识点的更加详尽的说明请查阅相关文档。字符串