[Leecode] 7. 整數反轉
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231−1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。
解題1(PHP)
執行用時 | 內存消耗 |
---|---|
8 ms | 15 MB |
class Solution {
function reverse($x) {
$negative = $x<0?true:false;
$symbol = $negative?"-":"";
$abs = $negative?abs($x):$x;
$strval = strval($abs);
$strrev = strrev($strval);
if( $strrev < pow(2,31) ){
$intval = intval($symbol . $strrev);
return $intval;
} else {
return 0;
}
}
}
解題2(Cpp)
執行用時 | 內存消耗 |
---|---|
4 ms | 8.1 MB |
81.15% | 89.58% |
解題思路:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
當x爲正數時:
- 如果 temp = 導致溢出,那麼一定有
- 如果,那麼一定會溢出
- 如果 ,那麼只要 , 就會溢出
- 其中7爲
class Solution {
public:
int reverse(int x) {
int r = 0;
int INT_MAX_10 = INT_MAX/10;
int INT_MIN_10 = INT_MIN/10;
int INT_MAX_LIMIT = INT_MAX%10;
int INT_MIN_LIMIT = INT_MIN%10;
while( x!=0 ){
int p = x % 10;
x /= 10;
if( r>INT_MAX_10 || ( r==INT_MAX_10 && p>INT_MAX_LIMIT ) ) return 0;
if( r<INT_MIN_10 || ( r==INT_MIN_10 && p<INT_MIN_LIMIT ) ) return 0;
r = r*10 + p;
}
return r;
}
};
錯誤示例1
這裏是錯誤是當x爲-2147483648時,x *= -1會溢出
class Solution {
public:
int reverse(int x) {
int temp = 0;
bool negative = x<0?true:false;
int HeadNum;
if( negative ){
x *= -1;
HeadNum = INT_MIN % 10 * -1;
} else {
HeadNum = INT_MAX % 10;
}
while( x>0 ){
int p = x % 10;
if( (negative && (temp < INT_MIN/10 || (temp == INT_MIN/10 && p<HeadNum))) ||
(!negative && (temp > INT_MAX/10 || (temp == INT_MAX/10 && p>HeadNum))) )
return 0;
temp = temp * 10 + p;
x /= 10;
}
if( negative )
temp *= -1;
return temp;
}
};