題目連結:
題目意譯:
你給定一個只由數字組成的字串 num。
回傳從 num 的位數數字中你可以形成的最大迴文數(以字串之形式)為何。該數不應包含前導零。
注:
你不需要使用掉 num 中的所有數字,但你必須使用至少一個數字。
這些數字可以被重新排列。
限制:
1 ≦ num.length ≦ 10 ^ 5
num 由數字組成。
範例測資:
範例 1:
輸入: num = "444947137"
輸出: "7449447"
解釋:
從 "444947137" 中拿出 "4449477" 這些數字來形成迴文數 "7449447"。
可以證明 "7449447" 是可以形成的迴文數中最大者。
範例 2:
輸入: num = "00009"
輸出: "9"
解釋:
可以證明 "9" 是可以形成的迴文數中最大者。
注意到回傳的數字不應包含前導零。
解題思維:
把我們要形成的迴文數拆成左半邊和右半邊(先不考慮有沒有正中間的),然後只考慮左半邊(或右半邊也行)即可。
為了讓數字越大越好,則我們需要從大的數字開始放。因此我們先掃過一次 num 來統計每一種數字各有多少個,然後從數字 9 開始一路掃到 0。
當有一種數字 x,其數量 > 1 時,代表我們可以左半邊放一個、右半邊放一個,所以一次就使用掉兩個 x。而我們可以重複此步驟直到 x 的剩餘數量 ≦ 1 為止。
掃過每一種數字並盡可能地使用掉它們後,如果現在左半邊為空(代表沒有任何數字數量 > 1)或是左半邊是以 0 作為開頭的(代表除了 0 以外沒有其他數字數量 > 1),此時統一把左半邊設為空字串並將 0 的數量設為至少 1(作為最後的底線。因為有可能根本沒有其他種類的數字,而我們之前可能已經剛好把 0 消耗光光了)。
接著右半邊只要複製左半邊的內容並反轉即可。最後再由大到小掃過一次每一種數字,看有沒有數字的剩餘數量不為零。如果有則表示該種數字可以作為中心數字,因此所求為「左半邊」 + 「中心數字」 + 「右半邊」;如果沒有,則所求為「左半邊」 + 「右半邊」。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。