LeetCode Problem:Reverse Integer

Problem 7:Reverse Integer

Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321

補充


C++中int類型變量的表示範圍爲:-2147483648~2147483647。爲什麼是這個範圍呢?我們知道int有32位,最高那位是符號位。注意下面說的都是原碼錶示,假如符號位爲0,剩餘的全爲1,那麼這個數就是2147483647,也就是int能表示的最大整數,假如符號位爲1,剩餘的也全爲1,那麼這個數就是最小的負數,也就是-2147483647。
但其實int的最小負數是-2147483648,這是一個特殊的數字,它的原碼是10000000000000000000000000000000(31個0),補碼也是這個。
對於原碼補碼用一句話總結:確定範圍看原碼,表示及運算用補碼。

也就是說,計算機中表示一個數都是表示成補碼形式,比如下面代碼:

int a = 0x7fffffff;//定義a的值爲0x7fffffff(補碼),其實就是int的最大數。

再比如:

int a = 0x7fffffff;
int b = a+1;//此時b的補碼爲1000...(31個0),也就是最小的負數

下面看一個坑:

if(0 < -2147483648)
{
        cout<<"0 < -2147483648"<<endl;
}
else
{
        cout<<"0 >= -2147483648"<<endl;
}

它輸出:0 < -2147483648

再看下面代碼:

int MIN = -2147483648;
if(0 < MIN)
{
        cout<<"0 < -2147483648"<<endl;
}
else
{
        cout<<"0 >= -2147483648"<<endl;
}

它輸出:0 >= -2147483648

解題思路:


該題就是將輸入的數逆置,輸入的數可以是負數且在int範圍內。其實該題目關鍵是要解決逆置後溢出問題,由於題目超出int範圍就算溢出規定輸出0,那麼我們可以用long long保存逆置結果再判斷是否超出int範圍就行。不過判斷溢出的時候有個坑就是上面說的。

參考代碼:

class Solution {
public:
    int reverse(int x) {
        int flags = 0;
        if(x < 0)
        {
            x = -x;
            flags = 1;
        }
        stack<int> st;
        int a;
        while(x != 0)
        {
            a = x % 10;
            x /= 10;
            st.push(a);
        }
        long long result = 0;
        long long base = 1;
        while(!st.empty())
        {
            result += st.top() * base;
            if(isOverflow(result)) return 0;
            st.pop();
            base *= 10;
        }
        if(flags == 1) result = -result;
        return result;
    }
private:
    bool isOverflow(long long x){
        int MAX = 2147483647;
        int MIN = (int)-2147483648;
        if(x > MAX) return true;
        if(x < MIN) return true;
        return false;
    }
};

轉載請註明原文地址:http://blog.csdn.net/u012619640/article/details/48422567

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章