[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 = rev ⋅ 10 + pop \text{rev}\cdot 10 + \text{pop} rev⋅10+pop 导致溢出,那么一定有 rev ≥ I N T _ M A X 10 \text{rev} \geq \frac{INT\_MAX}{10} rev≥10INT_MAX
- 如果 rev > I N T _ M A X 10 \text{rev} > \frac{INT\_MAX}{10} rev>10INT_MAX,那么 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop一定会溢出
- 如果 rev = = I N T _ M A X 10 \text{rev} == \frac{INT\_MAX}{10} rev==10INT_MAX,那么只要 pop > 7 \text{pop} > 7 pop>7, t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop 就会溢出
- 其中7为 I N I _ M A X % 10 INI\_MAX \% 10 INI_MAX%10
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;
}
};