[LeetCode] 懶惰但不用 string 來解 #9 Palindrome Number
反轉數字就解完了
如果用字串解我們當然很直覺就想反轉字串,既然題目 "Follow up" 那邊不希望我們用字串,那我們就把數字當字串來反轉,就可以得到超乾淨的解答:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
return x == reverse(x);
}
int reverse(int x) {
int output = 0;
while (x != 0) {
const int digit = x % 10;
output *= 10;
output += digit;
x /= 10;
}
return output;
}
};
Overflow!
只是解完前幾題之後我們大概對 int 範圍都很敏感了,我們知道任意對 int 操作很容易讓他超出 [INT_MIN, INT_MAX] 的範圍,所以我們在還沒 submit 之前就大概知道上面這個解會 overflow 壞掉。
如果你看過 #7 或 #8 我的解答你可能會猜說這作者到底有什麼強迫症就是要在 int 限制下偵測 overflow,是不是又要搬出什麼 safeMultiply, safeAdd。
可是既然題目只問我能不能不要轉成 string 來解題:
當然可以啊,那我把上面 code 改一下,不轉 string 我轉 long 就不用麻煩去偵測 overflow 了:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
return (long)x == reverse(x);
}
long reverse(int x) {
long output = 0;
while (x != 0) {
const int digit = x % 10;
output *= 10;
output += digit;
x /= 10;
}
return output;
}
};
結語
我是不知道 LeetCode 網頁上的解答是有什麼強迫症一定要用迂迴的方式來解題,就只是為了面試? 當然面試官可以在你正準備用 string 的時候補一句 "你可以不用 string 做到嗎",我改用 "long" 還是可以再補一句 "你可以只用 int 做到嗎"? 然後大概就會花個 30 分鐘在面試官與面試者間你來我往補各種邏輯上的漏洞。
問題是真的在寫軟體誰會這樣寫,會這樣寫與問的人大概都很會在 codebase 製造 bugs。
用 long 版本的結果看起來也不差,但可讀性可是大爆發。
如果你真的只想用 int 又想要維護可讀性,那就把 #8 的 safeMultiplyAndAdd 拿來用一下就好了。
留言
發佈留言