文章为原创首发地址: 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
# 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'
# 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