[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 又想要維護可讀性,那就把 #8safeMultiplyAndAdd 拿來用一下就好了。

留言

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

[Side Project] 互動式教學神經網路反向傳播 Interactive Computational Graph

[插件] 在 Chrome 網頁做區分大小寫的搜尋