给出了整数列表。我们需要对此列表进行排序以在连接后获得最大数量。
例如,我们有
[4, 94, 9, 14, 1]
必须按照
进行排序[9, 94, 4, 14, 1]
并提供号码9944141
。
答案 0 :(得分:2)
任何自定义排序归结为实现比较器,它可以告诉你哪些元素在哪些元素之前。
在您的情况下,您应该尝试一些简单的示例来查看比较应该如何工作。让a <~ b
表示“a应该在b之前排序”。一些例子:
9 <~ 94
89 <~ 8 (why?)
14 <~ 1
5 <~ 4
基于这些示例,您应该编写一个函数
def compare(a, b):
# return -1 if a < b according to the rule above, 0 if they are equal and 1 otherwise
然后你可以简单地调用Python的sort函数:
numlist.sort(cmp=compare)
(由于没有给出代码,问题听起来像是一个练习,我的答案集中在提供提示而不是完整的解决方案!)
答案 1 :(得分:2)
举个例子,由于O(n!)复杂性,这种方法不能很好地扩展:
>>> import itertools
>>> l = [4, 94, 9, 14, 1]
>>> print list(max((int("".join(p)), p) for p in itertools.permutations(str(x) for x in l))[1])
['9', '94', '4', '14', '1']
找到所有排列,将单个项目转换为字符串并连接,结果将转换为整数。选择具有最高整数值的置换。
更新:
如果有人对更好的表现感兴趣:
def compare(x, y):
sx = str(x)
sy = str(y)
sxy = sx + sy
syx = sy + sx
if sxy < syx:
return -1
elif sxy > syx:
return +1
return 0
print sorted(l, cmp=compare, reverse=True)
# It gives [9, 94, 4, 14, 1]
答案 2 :(得分:2)
最简单但效率不高的方法是:
import itertools
nums = [4, 94, 9, 14, 1]
max_num = 0
max_nums = None
for p in itertools.permutations(map(str, nums)):
num = int(''.join(p))
if num > max_num:
max_num = num
max_nums = p
print map(int, max_nums)
print max_num
输出:
[9, 94, 4, 14, 1]
9944141