另一種方法是: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。:-)