[Leetcode] Reverse Integer 反轉整數

Reverse Integer

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321java

字符串法

複雜度

時間 O(n) 空間 O(n)git

思路

先將數字轉化爲字符串,而後將字符串倒序輸出,並轉回數字。記得須要去除首部多餘的0。優化

模十法

複雜度

時間 O(n) 空間 O(1)code

思路

經過對數字模十取餘獲得它的最低位。其實本題考查的是整數相加的溢出處理,檢查溢出有這麼幾種辦法:rem

  • 兩個正數數相加獲得負數,或者兩個負數相加獲得正數,但某些編譯器溢出或優化的方式不同
  • 對於正數,若是最大整數減去一個數小於另外一個數,或者對於負數,最小整數減去一個數大於另外一個數,則溢出。這是用減法來避免加法的溢出。
  • 使用long來保存可能溢出的結果,再與最大/最小整數相比較

代碼

public class Solution {
    public int reverse(int x) {
        long result = 0;
        int tmp = Math.abs(x);
        while(tmp>0){
            result *= 10;
            result += tmp % 10;
            if(result > Integer.MAX_VALUE){
                return 0;
            }
            tmp /= 10;
        }
        return (int)(x>=0?result:-result);
    }
}

2018/10字符串

func reverse(x int) int {
    // The reserse of MinInt32 will overflow
    if x == math.MinInt32 {
        return 0
    }
    sign := 1
    // Handle negative numbers
    if x < 0 {
        x = -x
        sign = -1
    }
    result := 0
    for x > 0 {
        rem := x % 10
        // When the result == MaxInt32/10, the reminder has to be smaller than 7
        // so that result*10 + rem won't overflow (MaxInt32 is 2147483647)
        if math.MaxInt32/10 < result || (math.MaxInt32/10 == result && rem > 7) {
            return 0
        }
        result = result*10 + rem
        x = x / 10
    }
    return result * sign
}

後續 Follow Up

Q:拿到反轉整數題目後第一步是什麼?
A:先問出題者尾部有0的數字反轉後應該是什麼形式,其次問清楚溢出時應該返回什麼。編譯器

Q:除了檢查溢出返回特定值之外,有沒有別的方法處理溢出?
A:能夠使用try-catch代碼塊排除異常。it

相關文章
相關標籤/搜索