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

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