【翻轉整數考慮溢位】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:好法!
參考網址:
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則溢位。