題目連結:
題目意譯:
給定一個字串 n 代表著一整數。回傳最接近的整數(不包含自身),使得該整數為一個迴文。如果有多個最接近的整數,則回傳最小者。
「最接近」定義為最小化後的兩整數之絕對差值。
限制:
1 ≦ n.length ≦ 18
n 只包含數字。
n 不包含前導零。
n 代表的整數位於範圍 [1, 10 ^ 18 - 1] 中。
範例測資:
範例 1:
輸入: n = "123"
輸出: "121"
範例 2:
輸入: n = "1"
輸出: "0"
解釋: 0 和 2 為最接近的迴文,但是我們需要回傳最小者,其即為 0。
解題思維:
首先,如果 n 本身不是迴文,則把 n 的「右半邊」變成跟「左半邊」一樣會是最接近迴文數的「候選者」之一。例如 n = "12933",則你會有 "12921" 這個候選。當然如果 n 本身是迴文則無視這個候選(根據題意)。
由於這個造出來的迴文數可能會大過,也有可能會小過原本的數字 n(但一定會是位於某一側且最接近 n 的迴文數)。因此我們需要考慮位於「另外一端」的數字。
承 n = "12933" 這個例子。"12921" < "12933",而我們需要找到另外一個 > "12933" 的迴文數,並且要盡可能地接近 n。
可以看到最好的方式便是從「中間」開始改起(由於從任一側開始,另一側也會跟著變動;而最左側的數值越大,所以應越晚改)。因此如果原本迴文數是 "12821",則我們可以變成 "12921";而由於這邊是 "12921"(即最中間是 9),因此我們只能選擇變成 "13031"。
而如果原本是要找 < n 的數字,則也是從「中間」開始改變。例如說,"12921" 可以得到 "12821";"12021" 會得到 "11911"。
而又例如說迴文數是 "1001",則要變小的時候位數長也會跟著更動變成 "999";同理,如 "99999" 要變大的時候,會變成 "100001"。
因此將 n 變成迴文數(如果本來就是迴文則忽略)後,將該迴文數按照上面的策略變大以及變小(因為 n 本身就是迴文時,此時兩側都各自需要最接近的迴文數才能比較)。然後比較所有的候選來看誰最接近即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。