给定一个列表,例如:
[3, 30, 34, 5, 9]。
输出:9534330
编写程序返回尽可能大的数
在我的代码中,我在这里使用了排列:
from itertools import permutations
x = [3, 30, 34, 5, 9]
y = permutations(x)
n = len(y)
e = []
for i in y:
a = map(str, i)
e.append(int("".join(i)))
print "Largest Number {}".format(sorted(e)[-1])
这里 n 是排列数的长度,因为 5!,所以是 120。
有没有更好的方法来解决这个问题?
按降序对所有数字进行排序是我们想到的最简单的解决方案。但这不起作用。
例如,548 大于 60,但在输出中,60 在 548 之前。作为第二个示例,98 大于 9,但在输出中,9 在 98 之前。
解决方案是使用任何基于比较的排序算法。因此,不使用默认比较,而是编写一个比较函数 myCompare() 并使用它对数字进行排序。
给定两个数字 X 和 Y,myCompare() 应该如何决定先放哪个数字——我们比较两个数字 XY(Y 附加在 X 的末尾)和 YX(X 附加在 Y 的末尾)。
如果 XY 较大,则在输出中,X 应该在 Y 之前,否则 Y 应该在 X 之前。
例如,设 X 和 Y 分别为 542 和 60。为了比较 X 和 Y,我们比较 54260 和 60542。由于 60542 大于 54260,我们将 Y 放在第一位。
计算排列会产生更高的时间复杂度。
python 中更好的解决方案是:
def largestNumber(A):
maxlen = len(str(max(A)))
if all(v == 0 for v in A):
return '0'
return ''.join(sorted((str(v) for v in A), reverse=True,
key=lambda i: i*(maxlen * 2 // len(i))))
largestNumber([3, 30, 34, 5, 9])