给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例:
给出 [1, 20, 23, 4, 8],返回组合最大的整数应为8423201。
思路:
把两个数拼在一起,然后再把这两个数换个顺序再拼在一起,这时候就可以直接比较了。比如2332和23,变成233223和232332两个数,这时候哪个数更大,就说明这个数前半部分的那个数是更大的,这里是2332。
我的第一种方法
def largestNumber(nums):
str_nums = map(str, nums)
for i in xrange(len(nums)):
for j in xrange(i+1, len(nums)):
int_ij = int(str_nums[i] + str_nums[j])
int_ji = int(str_nums[j] + str_nums[i])
if int_ij < int_ji:
str_nums[i], str_nums[j] = str_nums[j], str_nums[i]
if str_nums[0] == '0':
return '0'
return ''.join(str_nums)
我的第二种方法:
def ab(a, b):
longab = long(a+b)
longba = long(b+a)
if longab > longba:
return -1
elif longab < longba:
return 1
else:
return 0
def largestNumber(nums):
str_nums = map(str, nums)
str_nums2 = sorted(str_nums, cmp=ab)
if str_nums2[0] == '0':
return '0'
return ''.join(str_nums2)
sorted()函数,对可迭代的对象进行排序操作。
语法:sorted(iterable, cmp, key, reverse)
返回值:列表
参数:
iterable 可迭代对象
key 用来比较的元素。用一个函数来指定可迭代对象中的一个元素来进行排序。函数只有一个参数。默认值为可迭代对象中的第一个元素。
reverse 排序规则,默认 reverse = False 升序,若指定 reverse = True 则为降序 。
重点说说 cmp:
cmp 用于比较的函数。
a = [1,2]
def ab(a,b):
#函数体
print sorted(a, cmp=ab)
#如果想2排在1后面,即升序:
def ab(a,b):
if a > b:
return 1
elif a < b:
return -1
else:
return 0
#如果想2排在1前面,即降序:
def ab(a,b):
if a < b:
return 1
elif a > b:
return -1
else:
return 0
#其实返回值为”大于零“、”小于零“、”等于零“就行,所以可以简化为
#升序
def ab(a,b):
return a - b
网上找到最简洁的代码:
def compare(a, b):
return [1, -1][a + b > b + a]
def largestNumber(nums):
nums = sorted([str(x) for x in nums], cmp = compare)
ans = ''.join(nums).lstrip('0')
return ans or '0'
lintcode 原题
思路的 出处
最简代码的 出处
20180110