python - 形成列表中可能的最大数字

标签 python algorithm permutation

<分区>

给定一个列表,例如: [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])

关于python - 形成列表中可能的最大数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865446/

相关文章:

python - Python (Linux) 中的多媒体键

php - 一个 Web 框架,其中 AJAX 不是事后的想法

java - 以这样的方式实现堆栈,以便我们可以在 O(1) 中找到最小值

Java Staircase 打印方向错误 (hackerrank)

python - 具有 4 个基本运算的表达式组合

python - Matplotlib 无法在 Python 3.5 上正确安装

python - Google App Engine 上 Django 中的包含标签

java - 使用 XOR 方法查找数组中缺失和重复的元素

python - 使用 Factoradic 系统允许重复时查找第 K 个字典排列

java - 时间复杂度 : Getting incorrect result