题目:最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 :
输入: [10,2],输出: 210
输入: [3,30,34,5,9],输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
-----------------------------------------------------------------------------
思路:通过对题目的分析,可以想到的是先比较每个元素的第一个字符,然后第二个字符 . . . 以此类推,但是这无法解决 “3,30,34” 中“3”这种特殊情况。
参考网友提供的思路,这是一个需要考虑 "权重" 的问题,此处的权重就是两个元素a和b的排序带来的不同,a+b和b+a的大小判断。
解法1:
class Solution(object):
def largestNumber(self, nums):
n = len(nums)
for i in range(n):
for j in range(n-i-1):
temp_1 = str(nums[j])
temp_2 = str(nums[j+1])
if(int(temp_1+temp_2)<int(temp_2+temp_1)):
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
output = ''
for num in nums:
output = output + str(num)
return str(int(output))
解法2#:通过cmp_to_key函数
class Solution(object):
def largestNumber(self, nums):
"""
:type nums: List[int]
:rtype: str
"""
# 为空校验
if not nums:
return "0"
# 将数组nums,转换成字符串列表nums
nums = list(map(str, nums))
from functools import cmp_to_key
# 定义函数cmp,用于判断大小得到两两比较的数值结果
cmp = lambda a,b: 1 if a+b > b+a else -1 if a+b < b+a else 0
print(cmp)
nums.sort(key=cmp_to_key(cmp),reverse=True)
return str(int("".join(nums)))
参考: