[Leecode] 7. 整數反轉

[Leecode] 7. 整數反轉

[LeetCode] 每日一題彙總

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123
輸出: 321

示例 2:

輸入: -123
輸出: -321

示例 3:

輸入: 120
輸出: 21

注意:

假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231−1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

解題1(PHP)

執行用時 內存消耗
8 ms 15 MB
class Solution {
    function reverse($x) {
        $negative = $x<0?true:false;
        $symbol = $negative?"-":"";
        $abs = $negative?abs($x):$x;
        $strval = strval($abs);
        $strrev = strrev($strval);
        if( $strrev < pow(2,31) ){
            $intval = intval($symbol . $strrev);
            return $intval;
        } else {
            return 0;
        }
    }
}

解題2(Cpp)

執行用時 內存消耗
4 ms 8.1 MB
81.15% 89.58%

解題思路:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
當x爲正數時:

  • 如果 temp = rev10+pop\text{rev}\cdot 10 + \text{pop} 導致溢出,那麼一定有revINT_MAX10\text{rev} \geq \frac{INT\_MAX}{10}
  • 如果rev>INT_MAX10\text{rev} > \frac{INT\_MAX}{10},那麼temp=rev10+poptemp = \text{rev} \cdot 10 + \text{pop}一定會溢出
  • 如果 rev==INT_MAX10\text{rev} == \frac{INT\_MAX}{10},那麼只要 pop>7\text{pop} > 7temp=rev10+poptemp = \text{rev} \cdot 10 + \text{pop} 就會溢出
  • 其中7爲INI_MAX%10INI\_MAX \% 10
class Solution {
public:
    int reverse(int x) {
        int r = 0;
        int INT_MAX_10 = INT_MAX/10;
        int INT_MIN_10 = INT_MIN/10;
        int INT_MAX_LIMIT = INT_MAX%10;
        int INT_MIN_LIMIT = INT_MIN%10;
        while( x!=0 ){
            int p = x % 10;
            x /= 10;
            if( r>INT_MAX_10 || ( r==INT_MAX_10 && p>INT_MAX_LIMIT ) ) return 0;
            if( r<INT_MIN_10 || ( r==INT_MIN_10 && p<INT_MIN_LIMIT ) ) return 0;
            r = r*10 + p;
        }
        return r;
    }
};

錯誤示例1

這裏是錯誤是當x爲-2147483648時,x *= -1會溢出

class Solution {
public:
    int reverse(int x) {
        int temp = 0;
        bool negative = x<0?true:false;
        int HeadNum;
        if( negative ){
            x *= -1;
            HeadNum = INT_MIN % 10 * -1;
        } else {
            HeadNum = INT_MAX % 10;
        }
        while( x>0 ){
            int p = x % 10;
            if( (negative && (temp < INT_MIN/10 || (temp == INT_MIN/10 && p<HeadNum))) ||
                (!negative && (temp > INT_MAX/10 || (temp == INT_MAX/10 && p>HeadNum))) )
                return 0;
            temp = temp * 10 + p;
            x /= 10;
        }
        if( negative ) 
            temp *= -1;
        return temp;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章