2020年6月16日 星期二

LeetCode 7. Reverse Integer [Easy] [C++] 解題筆記

題目: Given a 32-bit signed integer  x ,  reverse digits of an integer.

EX:
    Input: 123
    Output: 321
想法:
    這題乍看很簡單,但其實有些小細節要特別注意,首先因為 32-bit signed integer range: -2147483648~2147483647,
所以需要注意 overflow 的情況,例如翻轉 2147483647 翻轉後變成 7463847412 就溢位了,而判斷是否 overflow 我們可以檢查
翻轉到目前的位數是否 > 214748364 (INT_MAX / 10),因為若是大於 214748364 則下一位是多少都會 overflow,而為啥不用考慮
剛好等於 214748364 的情況呢? 因為输入的x也是一个整數,所以x的范圍也在 -2147483648~2147483647 之間,
那摸 x 的第一位只能是1或者2,翻轉之后 res 的最後一位只能是1或2,所以 res 只能是
2147483641 或 2147483642 都在 int 的范圍内。但是它們對應的x為 1463847412 和 
2463847412,後者overflow。所以當 res 等於 214748364 時, x只可能是 1463847412, 
翻轉後的结果為 2147483641,在整數的範圍內,所以不用考慮等於的情況。

完整程式碼:
class Solution {
public:
    int reverse(int x) {
        int res = 0;
        
        while (x != 0) {
            // overflow
            if (abs(res) > INT_MAX / 10) { return 0; }
            res = res*10 + x % 10;
            x = x / 10;
        }
        
        return res;
    }
};

沒有留言:

張貼留言