题目要求:
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例1:
输入:x = 123
输出:321
示例2:
输入:x = -123
输出:-321
示例3:
输入:x = 120
输出:21
示例4:
输入:x = 0
输出:0
思路分析:
1、首先对输入的数字进行判断,如果输入的数字大于2^31-1或者小于-2^31,直接返回0;
2、对数字的正负进行判断,如果输入为正数,则对数字按位进行除零,将数字按位处理后重新生成一个新的数字。
3、将生成的新的数字重新加上正负号。
按照这种思路,代码如下:
public static int reverse(int x) {
int num = 0;
if (x > Math.pow(2, 31) - 1 || x < (-1) * Math.pow(2, 31)) {
return 0;
} else if (x > 0) {
while (x % 10 != 0) {
num *= 10;
num += x % 10;
x /= 10;
}
return num;
} else {
x *= -1;
while (x % 10 != 0) {
num *= 10;
num += x % 10;
x /= 10;
}
return -1 * num;
}
}
代码简化:
上面的代码实行思路比较简单易懂,但是代码过于冗杂,不利于书写。那么java中有没有方法,调用后可以实现自动反转呢?
StringBuffer / StringBuilder类中有reverse()方法可以实现此功能。那么我们这里调用StringBuilder中的方法进行尝试。
1、StringBuilder传参时需要传入String类型的参数,所以我们这里需要将int类型的形参x转换为String类型。通过String.valueOf()方法,将int -> String。
2、但是需要注意的是,原数据需要先取绝对值,否则调用reverse()方法的时候,“-”符号会连带着数字一起反转。
3、通过sb对象调用StringBuilder的reverse()方法,此时返回的是一个StringBuilder对象。所以,需要将其装换成int类型我们想到了Integer包装类下的valueOf()方法。但是Integer.valueOf()需要的参数是String类型,所以我们还需要对sb.reverse()进行转换。可以调用String类下的valueOf()方法,同时也可以通过sb.reverse().toString()进行转换。
4、判断输入数据是否过大,除了调用if方法进行判断,还可以通过try...catch语句块。当数据过大时,返回0的代码就放在catch语句块中。
public static int reverse(int x){
try {
StringBuilder sb = new StringBuilder(String.valueOf(Math.abs(x)));
x = x>0 ? Integer.valueOf(String.valueOf(sb.reverse())) : -1*Integer.valueOf(String.valueOf(sb.reverse()));
} catch (NumberFormatException e){
e.printStackTrace();
return 0;
}
return x;
}