給定一組非負整數,從新排列它們的順序使之組成一個最大的整數。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參數,因此要進行這樣的排序操做更加複雜了。有關此知識點的更加詳盡的說明請查閱相關文檔。字符串