題目要求很簡單,就是翻轉整數。唯一需要留意的地方是題目中提到假設只能存儲32位的整數,也就是說在判斷是否溢出時不能用long類型的變量來判斷是否溢出。
解決方式如下:
class Solution {
public:
int reverse(int x) {
int result = 0;
while(x != 0){
int r = result * 10 + x % 10;
if(r / 10 != result){ //判斷是否溢出,本來應該是(r - x % 10) / 10 != result,由於x % 10總是小於10的數,對結果無影響,所以在此刪去
return 0;
}
result = r;
x /= 10;
}
return result;
}
};
這裏判斷溢出的方法是判斷算出來的 r 和逆運算回去的 result 是否相等。因爲如果 r 的值溢出,則會有損失,值會不同。
解法二:
class Solution {
public:
int reverse(int x) {
int result = 0;
while (x != 0) {
if (abs(result) > INT_MAX / 10) return 0;
result = result * 10 + x % 10;
x /= 10;
}
return result;
}
};
這個解法中的判斷溢出是在result進行下一次運算之前判斷的,也就是說假如 result 的絕對值大於 INT_MAX / 10,那麼下一行的 result = result * 10 + x % 10 必定會溢出。(INT_MAX的值爲214748364)假如result的絕對值沒有大於 INT_MAX / 10,假設爲214748364,因爲 x 是整數,一定會在整數範圍-2147483648~2147483647之間,那麼當取到極限位數(10位)時,x 的第一位數一定是1或者2,此時執行 result = result * 10 + x % 10 一定不會溢出(此時 x % 10 爲1或者2)。