给出如下列表: [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是排列数的长度是120,因为5!。 有没有更好的方法来解决这个问题?
答案 0 :(得分:4)
按降序对所有数字进行排序是我们遇到的最简单的解决方案。但这不起作用。
例如,548大于60,但在输出中,60位于548之前。作为第二个例子,98大于9,但9在输出中位于98之前。
解决方案是使用任何基于比较的排序算法。因此,不要使用默认比较,而是编写比较函数myCompare()并使用它来对数字进行排序。
给定两个数字X和Y,myCompare()应该如何决定首先放入哪个数字 - 我们比较两个数字XY(X末尾附加的Y)和YX(Y末尾附加的X)。
如果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])
答案 1 :(得分:1)
这个问题的解决方案带来了一个值得解释的有趣变革。
假设我们想知道给定XY
和YX
中哪个X
或Y
更大。在数字上,我们想要X.10^y + Y
和Y.10^x + X
中最大的一个,其中小写字母表示大写变量的位数。
然后用一点点数学,比较
X.10^y + Y < Y.10^x + X
可以改写
X / (10^x - 1) < Y / (10^y - 1)
这样XY < YX
肯定是一个传递关系,并定义了一个总顺序。这是一个非常好的消息,因为它意味着可以通过使用这种修改过的比较操作将问题简化为普通排序。
现在注意X / (10^x - 1)
是0.XXXX...
形式的周期性小数,为了比较0.XXXX...
和0.YYYY...
,只需比较最长的时间段即可。因此,比较可以作为普通的字符串比较,除了当到达较短字符串的末尾时,我们循环回到第一个字符。
E.g。 12345 > 12
因为12345 > 12|12|1
和12105 < 12
而12105 < 12|12|1
。
def Cmp(X, Y):
l= max(len(X), len(Y))
for i in range(l):
if X[i % len(X)] < Y[i % len(Y)]:
return 1 # X > Y
elif X[i % len(X)] > Y[i % len(Y)]:
return -1 # X < Y
return 0 # X == Y
比较功能可以描述如下:
%
我不推荐这种特殊的实现,由于cross-validation
。