題目連結:
題目大意:
給定一正整數N,代表接下來有N個正整數。
求那N個數字排列組合並接在一起,產生出來的新數字的最大值。
範例輸入:
5 123 124 56 90 9
5 28 285 287 2851 2859
2 25 2523
3 89 898 899
範例輸出:
99056124123
2872859285285128
252523
89989898
解題思維:
變化的排序題。
我們可以藉由討論以下情形,從而知道排序的比較條件。以下稱第一個拿來比較的數字為N1,第二數字則為N2:
第一種情形,N1、N2的位數一樣。非常直觀,直接看誰大誰小就好。大的放前面(左邊),小的則是在後面;如果一樣,那放哪都沒差。
第二種情形,N1比N2的位數多。假設N1的長度為S1,
(2023 / 12 / 7 編輯:這部分錯的,但是只錯最後的部分)
N2的長度為S2。那麼先由最左邊的位數到第S2個位數,判斷在相同位數時,是否有誰比較大。有的話就跟第一種情形一樣,大的放前面,小的放後面;反之,則繼續比較。
如果比到前S2位都一樣大,
那就拿N1的「第S2+1位」與N2的「第1位」比較,有誰大誰小的話,則同上;
不然,拿N1的「第S2+2位」跟N2的「第2位」比較,同上。
以此類推,直到有誰大誰小或是N1的所有位數都比過了。
全部比較完,卻還沒有分出勝負的話:就把短的放前面,長的放後面即可。
編輯:並非如此。例如說 132 和 13 比較,應當是 132 在前面(可以看到 13213 > 13132)。原因是比較的過程不應停止於兩者的最小長度,應繼續進行。
也就是最短的字串再從頭開始,而較長的字串則繼續。如果過程中有字串又跑到了結果則再回到開頭。直到兩者又同時回到開頭,也就是比較次數是兩者長度的最小公倍數(Least Common Multiple)。如果比到這個時候都沒有分出勝負,則兩者誰先誰後都可以。
最後的第三種情形,N1的位數比N2少。而其實我們已經在第二種情形的時候就解決了,只是N1、N2大小顛倒而已。
這樣便可以確保接起來的數字,是盡可能地大了。
而比較的方法有了,剩下的就是排序的方法本身。而手段很多,可以用內建的sort、也可以自己寫其他的排序法。這裡就交給讀者們各自去找到出路。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。