另一种方法是:from itertools import cycle, islice
def extender(n):
def extend(x):
s = str(x)
return "".join(islice(cycle(s), n))
return extend
def biggest_number(input):
if (len(input) == 0):
return 0
extend = extender(len(str(max(input))) * 2)
s = sorted(input, key=extend, reverse=True)
return int("".join(map(str, s)))
基本上,您需要获取数组的每个元素,并根据需要重复,使它们具有相同的长度。然后你做一个字典排序。(在这一点上,数字排序是相同的,但完成后我们需要字符串。)
例如,对于[3, 30, 34, 5, 9],我们发现最长的数字是2个数字,因此我们根据需要重复这些数字,从而将所有内容扩展为三个数字。以下是使用的键:
^{pr2}$
然后对结果进行排序、降序和组合:
^{3}$
直觉来自于从“选择前导数字最大的数字”开始,问题是我们应该如何处理平局。E、 为什么我们要在30岁之前选3个呢?答案是,在3之后出现的最大数字是另一个3。(如果有一个更大的数字可用,我们已经选择了它。)所以把3看作“333333…”有助于我们选择正确的数字。类似的问题:为什么我们会选择10而不是100?这使我们认识到,10之后的最佳结果是另一个以10开头的数字。(我们已经选了11个或更多个)所以把它想象成“10101010…”和“100100100100…”。结果是,你只需要扩展到n*2数字,其中n是最长数字的长度。在
我知道这有点令人困惑。我写了一个测试来确保这些都是正确的。(与原始代码进行比较。)from functools import cmp_to_key
import random
def largestNumber(nums):
numStr = [str(i) for i in nums]
def str_cmp(x, y):
if y+x < x+y: return -1
elif y+x > x+y: return 1
else: return 0
numStr.sort(key=cmp_to_key(str_cmp))
return "".join(numStr).lstrip('0') or '0'
for i in range(1000000):
input = [random.randint(0, 1000) for _ in range(random.randint(0, 100))]
if biggest_number(input) != int(largestNumber(input)):
print("FAILED: {}".format(input))
if i % 100 == 0:
print(i)
我还没有找到有用的输入。我确信这段代码是正确的。在
所有这些都说明,我不知道你为什么不想只用cmp_to_key。:-)