【翻转整数考虑溢出】LeetCode 7. Reverse Integer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allenlzcoder/article/details/81585405

LeetCode 7. Reverse Integer

Solution1:最笨的方法

class Solution {
public:
    int reverse(int x) {
        if (!x) return x;
        int flag = x > 0? 1: -1;
        long long res = 0;
        int temp_x = abs(x);
        while (temp_x) {
            res = res * 10 + (temp_x % 10);
            temp_x /= 10;
        }
        res *= flag;
        if (res > INT_MAX || res < INT_MIN)
            return 0;
        return res;
    }
};

Solution2:(其实不咋好理解。。)
参考网址:http://www.cnblogs.com/grandyang/p/4125588.html
提交通过后,OJ给出了官方解答,一看比自己的写的更精简一些,它没有特意处理正负号,仔细一想,果然正负号不影响计算,而且没有用long long型数据,感觉写的更好一些,那么就贴出来吧:

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while (x != 0) {
            if (abs(res) > INT_MAX / 10) return 0;
            res = res * 10 + x % 10;
            x /= 10;
        }
        return res;
    }
};

在贴出答案的同时,OJ还提了一个问题 To check for overflow/underflow, we could check if ret > 214748364 or ret < –214748364 before multiplying by 10. On the other hand, we do not need to check if ret == 214748364, why? (214748364 即为 INT_MAX / 10)
为什么不用check是否等于214748364呢,因为输入的x也是一个整型数,所以x的范围也应该在 -2147483648~2147483647 之间,那么x的第一位只能是1或者2,翻转之后res的最后一位只能是1或2,所以res只能是 2147483641 或 2147483642 都在int的范围内。但是它们对应的x为 1463847412 和 2463847412,后者超出了数值范围。所以当过程中res等于 214748364 时, 输入的x只能为 1463847412, 翻转后的结果为 2147483641,都在正确的范围内,所以不用check。
Solution3:好法!
参考网址:https://blog.csdn.net/m0_37454852/article/details/78148840

class Solution {
public:
    int reverse(int x) {
        int y = 0;//需要返回的数
        while (x) {
            int temp = y;//暂存y的值
            y = y * 10 + x % 10;//倒序;把x的最低位依次压入y的最低位
            if((y-x%10)/10!=temp)//反向推,若推不出原值则溢出
                return 0;
            x/=10;
        }
        return y;
    }
};

总结: 如何判断是否溢出?
其实看我上面的代码也可以看得出了,只要把这个式子反着推过来,再来看是否相等就行了。
1.加法溢出判断:若c=a+b; c-a!=b则溢出;或者a, b>0, c<0溢出;或者a, b<0, c>0溢出;
2.减法溢出判断:若c=a-b; c+b!=a则溢出;
3.除法溢出判断:若b!=0 && a/b=c; b*c!=a则溢出;
4.乘法溢出判断:若c=a*b; a!=0 && c/a!=b则溢出。

猜你喜欢

转载自blog.csdn.net/Allenlzcoder/article/details/81585405