做法:
- 判断
x
是否为负数,如果是的话,就取相反数,但是这里需要注意的是,如果x
为int
的最小值-x
还是本身,所以需要特判,而且INT_MIN
翻转之后会爆int所以世界返回0。(解释一下:负数在计算机中以补码的形式存储,INT_MIN
的二进制表示为:1000 0000 0000 0000 0000 0000 0000 0000
,以int
占四个字节为例,先-1
再取反的结果还是:1000 0000 0000 0000 0000 0000 0000 0000
) - 经过第一步之后
x
都为正数,然后进行翻转操作,需要注意的是,翻转的过程中用long long
保存,因为可能会爆int
。 - 判断是否在
int
范围内,若在则进一步判断,开始的x
是否为正数,若是则返回res
,否则返回0 - res
,若不在int
则直接返回0
。
C++:
typedef long long LL;
class Solution {
public:
int reverse(int x) {
if (x == INT_MIN) return 0;
bool isNeg = false;
if (x < 0) x = -x, isNeg = true;
LL res = 0;
while (x) {
res = res * 10 + x % 10;
x /= 10;
}
if (res >= INT_MIN && res <= INT_MAX) return isNeg ? 0 - res : res;
return 0;
}
};
Java:
class Solution {
public int reverse(int x) {
if (x == Integer.MIN_VALUE) return 0;
long res = 0;
boolean isNeg = false;
if (x < 0) {x = -x; isNeg = true;}
while (x > 0) {
res = res * 10 + x % 10;
x /= 10;
}
if (res >= Integer.MIN_VALUE && res <= Integer.MAX_VALUE)
return isNeg ? 0 - (int)res : (int)res;
return 0;
}
}