給出一組非負整數,從新排列他們的順序把他們組成一個最大的整數。

文章爲原創首發地址: https://hooyes.net/p/python-l...

描述

給出一組非負整數,從新排列他們的順序把他們組成一個最大的整數。python

例
給出 [1, 20, 23, 4, 8],返回組合最大的整數應爲 8423201
給出 [1, 201, 20, 9, 8],返回組合最大的整數應爲 98202011
給出 [1, 203, 20, 9, 8],返回組合最大的整數應爲 98203201

算法

我給簡單好理解的兩個排序算法:git

算法1:github

先把對比的數字轉成字符,拼接後再轉成整數進行大小對比,即 int(a+b) 與 int(b+a) 進行降序排列。代碼1。算法

算法2:測試

每一個元素逐個字符進行對比。代碼2。spa

代碼1

# Python2

class Solution:
    def largestNumber(self, nums):
        scmp = lambda a,b: int(b+a)-int(a+b)
        res = ''.join(sorted(map(str, nums), cmp=scmp)).lstrip('0')
        return res or '0'
# Python3 

from functools import cmp_to_key
class Solution:
    def largestNumber(self, nums):
        key = cmp_to_key(lambda a,b: int(b+a)-int(a+b))
        res = ''.join(sorted(map(str, nums), key=key)).lstrip('0')
        return res or '0'

代碼2

# Python2 

class Solution:
    def largestNumber(self,nums):
        def cxx(x,y):
            i = 0 
            sx= str(x)
            sy= str(y)
            while i< len(str(min(x,y))):
                if sx[i] > sy[i]:
                    return 1
                elif sx[i] < sy[i]:
                    return -1
                elif x == y:
                    return 0
                i+=1
            if i == len(sx):
                return -1 if sy[i]>sy[0] else 1
            if i == len(sy):
                return 1 if sx[i]>sx[0] else -1
        nx = sorted(nums,cmp=lambda x,y:cxx(x,y),reverse=True)        
        res = ''.join(map(str, nx)).lstrip('0')
        return res or '0'

測試

t = Solution()
print(t.largestNumber([1, 20, 23, 4, 8]))
// 8423201

以上代碼已放到Hooyes的Github上開源,歡迎Fork或提建議。.net

largest-number.py

運行 python largest-number.py 便可以測試。code

相關文章
相關標籤/搜索