1. 程式人生 > 實用技巧 >7. 整數反轉 - LeetCode

7. 整數反轉 - LeetCode

7. 整數反轉

題目連結

直接呼叫Java內建API

class Solution {
    public int reverse(int x) {
        int coefficient = 1;
        if(x < 0){
            coefficient = -1;
            x *= -1;
        }
        int ans = 0;
        try{
            ans = Integer.parseInt(new StringBuilder().append(x).reverse().toString());
        } catch(NumberFormatException e){
            ans = 0;
        } finally{
            return coefficient * ans;
        }
    }
}

這裡有幾點需要注意:

  • 存在負數的情況,若使用字串反轉,則無法處理負號,因此需要提前將係數提出。
  • 存在反轉後超過int範圍的情況,因此需要捕獲異常後,設定為0。

這樣寫法比較簡單,但是大材小用,速度有點慢,可以換成自己的反轉寫法。

自己反轉

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            int y = x % 10;
            x /= 10;
            if (ans > Integer.MAX_VALUE/10 || (ans == Integer.MAX_VALUE / 10 && y > 7)){
                return 0;
            }
            if (ans < Integer.MIN_VALUE/10 || (ans == Integer.MIN_VALUE / 10 &&y < -8)){
                return 0;
            }
            ans = ans * 10 + y;
        }
        return ans;
    }
}

自己反轉的難點在判斷是否溢位。題中要求-231<=x<=231-1,即是有符號整數int的範圍,可以與Integer.MAX_VALUE和Integer.MIN_VALUE進行比較。但是溢位就不好比了,所以需要在溢位之前判斷下一步是否可能溢位。因為我們是一位一位往上加,所以只需看到231的個位數是8,那麼對於正數來說,當前數字與Integer.MAX_VALUE/10比較,如果相同再比較個位數,負數也類似。