public class Solution {
public int reverse(int x) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int a = x;
x = Math.abs(x);
int y = 0;
while(x>0){
y = y*10 + (x%10);
x = x/10;
}
if(a<0){
y = (-1)*y;
}
return y;
}
}
上述解法虽然AC了,但是不够简练,可以不用判断是否是正数还是负数。
更重要的是,没有考虑到溢出的情况。leetcode上测试数据集没有考虑溢出的情况。
Java中Integer最大分别是2^31-1=2147483647
最小值是-2^31=-2147483648.为保证跨平台性,Java规定INT是4B长。
计算机中的数是用补码来保存的,第一位是符号位(+是1,-是0),后面是数值部分。
补码:正数补码=原码
负数补码=(符号位+数值部分取反)+1
0的补码永远是0.(-0的补码是1111+1=0000)
很显然,在最大值和最小值反转时,会有溢出。
比如最大值反转时,得到的结果是-1126087180,最小值反转时,得到的结果是126087180。
这时,我们需要对溢出做一个处理,抛出异常。