例如輸入是 [8, 23, 7, 9] --> 輸出是 98723
輸入 [865, 1038, 2] --> 輸出 86521038
uj5u.com熱心網友回復:
按每個數字的第一位降序排序,并連接排序后的數字。
array = [865, 1038, 2]
largest = int(''.join(sorted({str(n): int(str(n)[0]) for n in array}, reverse=True)))
print(largest)
輸出:
86521038
uj5u.com熱心網友回復:
我認為在比較不同長度的序列時,您可以重復較短的序列來處理評論和@Oli 的回答中指出的可能前綴情況。雖然這種方法感覺有點可疑,但它至少在第一眼看起來是有效的。當它們不是彼此的前綴時,“hack”不會做任何事情,因為比較的“正常”部分決定了。但是,當有前綴大小寫時,它似乎是必要的。
測驗用例5, 556(應該導致5565)和5, 554(應該導致5554)不能通過查看前綴(5vs 556/4),查看前綴的重復(5 5vs 5 56/4)來決定,但它需要即使我們實際上沒有那么多重復,也可以查看前綴的想象的第三個副本(555對 55 6/4)。
我不確定發生了什么,但不知何故它適用于這些少數測驗。
Piggybacking Oli 的框架,并添加了兩個新的測驗用例:
from functools import cmp_to_key
def largest_combination(input_list):
strings = [str(x) for x in input_list]
def compare(a: str, b: str):
complen = max(len(a), len(b))
while len(a) < complen:
a = a
a = a[:complen]
while len(b) < complen:
b = b
b = b[:complen]
return int(a) - int(b)
# sort and join together
combined = ''.join(sorted(strings, key=cmp_to_key(compare), reverse=True))
# convert to int
return int(combined)
if __name__ == '__main__':
print(largest_combination([8, 23, 7, 9]) == 98723)
print(largest_combination([865, 1038, 2]) == 86521038)
print(largest_combination([5, 56]) == 565)
print(largest_combination([5, 54]) == 554)
print(largest_combination([5, 556]) == 5565)
print(largest_combination([5, 554]) == 5554)
uj5u.com熱心網友回復:
將整數串列轉換為字串然后對它們進行排序接近正確答案,并且適用于問題中的示例。然而,正如user2357112-supports-monica指出的那樣,對于一個數字是另一個數字的前綴的情況,這會失敗,因為較長的數字總是放在最前面:例如[5, 54]變成545not 554。為了解決這個問題,我們可以制作一個自定義比較器來檢查這些前綴情況并通過查看公共前綴后的第一個數字并將其與數字的第一個數字進行比較來說明它們,例如,在[5, 54],4小于5, so 5come before 54, 但 in [5, 56],6大于5so 56come before 5。
下面是一些實作這一點的代碼:
def largest_combination(input_list):
strings = [str(x) for x in input_list]
def compare(a: str, b: str):
if a == b: # test for equality first, since every string starts with itself
return 0
if a.startswith(b): # if b is a prefix of a, discard the prefix from a and try comparing again
return compare(a[len(b):], b)
elif b.startswith(a): # symmetric case
return -compare(b, a)
elif a < b: # otherwise compare like a normal string
return -1
else:
return 1
# sort and join together
combined = ''.join(sorted(strings, key=cmp_to_key(compare), reverse=True))
# convert to int
return int(combined)
if __name__ == '__main__':
print(largest_combination([8, 23, 7, 9]) == 98723)
print(largest_combination([865, 1038, 2]) == 86521038)
print(largest_combination([5, 56]) == 565)
print(largest_combination([5, 54]) == 554)
print(largest_combination([5, 556]) == 5565)
print(largest_combination([5, 554]) == 5554)
print(largest_combination([12121, 12]) == 1212121)
print(largest_combination([21, 21212]) == 2121221)
編輯:修復了@tevemadar 善意指出的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368765.html
上一篇:給定一個服務物件及其主要依賴項,找到每個服務的所有依賴項(包括次要依賴項)
下一篇:鏈表未插入新值“C語言”
