看算法描述:
1、给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
2、如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
3、假设环境不允许存储 64 位整数(有符号或无符号)。
我们来分析这道算法题,这里有以下注意事项
1、数字反转后,有可能超出int的范围了
2、数字是带符号的,反转后也要带符号返回
3、数字不能以0开头
下面我们来实现数字的反转,代码如下:
public int reverse(int x) {//如果x等于int的最小值,那么直接返回0if (x == Integer.MIN_VALUE) {return 0;}//x是带符号的,可能为正也可能为负,我们先记录下来符号int sign = x > 0 ? 1 : -1;//定义反转后的数字为resultint result = 0;//定义个位上数字变量为lastint 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的最大值,如果大了,则直接返回0if (num > Integer.MAX_VALUE) {return 0;}//反转后,没有超过int的值,那么再强转回intresult = (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