class Solution {
public int reverse(int x) {
int neg = x < 0 ? -1 : 1;
x *= neg;
int ret = 0;
while (x > 0) {
int temp = ret;
temp *= 10;
temp += x%10;
if (temp / 10 != ret) return 0;
ret = temp;
x /= 10;
}
return ret * neg;
}
}
题比较简单,但有两个取巧的地方:
(1)正负状态的表示
这里不使用boolean去表示正负数,而是用+1和-1来表示,在结束时与结果做一次乘积。
int neg = x < 0 ? -1 : 1;
result *= neg;
(2)溢出判断
需要考虑值的溢出也是这个题比较麻烦的一点,并且这里不允许使用64位的数据类型。
这里使用的办法是使用一个临时变量temp作为每个循环执行加法的结果,再将temp还原与上一步结果做比较。因为如果加法溢出的话,那么temp必然不可能还原成功。
扩展:为什么负数范围总是多一位?
int的表示范围为[-2^31, 2^31-1],为什么负数多一位?
简单的说是因为0的反码编码有两个(+0与-0),而了避免这种情况,负数在反码的基础上-1(补码),于是将-0作为了-1使用,负数范围整体扩大了1。可以参考计算机为什么要用补码?