看算法描述:
1、给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
2、如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
3、假设环境不允许存储 64 位整数(有符号或无符号)。
我们来分析这道算法题,这里有以下注意事项
1、数字反转后,有可能超出int的范围了
2、数字是带符号的,反转后也要带符号返回
3、数字不能以0开头
下面我们来实现数字的反转,代码如下:
public int reverse(int x) {
//如果x等于int的最小值,那么直接返回0
if (x == Integer.MIN_VALUE) {
return 0;
}
//x是带符号的,可能为正也可能为负,我们先记录下来符号
int sign = x > 0 ? 1 : -1;
//定义反转后的数字为result
int result = 0;
//定义个位上数字变量为last
int last = 0;
//我们先处理x除了个位上的所有其它位的反转,因为带个位的反转后有可能超出int范围,因此需要我们对个位上的数做特殊判断处理
while ((last = x % 10) != x) {
result = result * 10 + last;
x = x / 10;
}
//如果个位数字不是0,那么对最后一位数的反转做特殊处理
if (last > 0) {
//由于直接反转有可能超过int的取值范围,因此我们先把int转long,这样就不超范围了
long num = result;
//对最后一位数反转
num = num * 10 + last;
//判断num有没有超过int的最大值,如果大了,则直接返回0
if (num > Integer.MAX_VALUE) {
return 0;
}
//反转后,没有超过int的值,那么再强转回int
result = (int)num;
}
//最后我们返回带符号的反转结果
return sign * result;
}
我们拿几个数字来测试一下
@Test
public void test() {
int[] arr = {123, -234, Integer.MIN_VALUE, Integer.MAX_VALUE};
for (int i = 0; i < arr.length; i++) {
System.out.println(reverse(arr[i]));
}
}
结果如下,可以看到结果是对的
321
-432
0
0