1. 程式人生 > >【翻轉整數考慮溢位】LeetCode 7. Reverse Integer

【翻轉整數考慮溢位】LeetCode 7. Reverse Integer

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則溢位。