内容纲要
题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [-2147483648, 2147483647] ,就返回 0 。
假设环境 不允许存储 64 位整数(有符号或无符号)。
提示
-2147483648 <= x <=
2147483647
思路
我的思路跟普通人一样,是转成字符串然后反转字符串最后再调用工具类将字符串重新转回int类型,这个过程需要注意字符串反转后可能会超出int类型的范围,题目的意思是超出范围则返回0,因此我们捕获出超出范围的异常后返回0即可。但是这样使用的内存和代码运行时间都会非常高。全程思路在演示代码中给出。
/**
* @author: LoungeXi
*/
public class Solution {
public int reverse(int x) {
// try/catch捕获出超出int范围的异常后返回 0
try {
// 因为字符串反转后有可能有前置0,因此设置一个哨兵来查看什么时候开始加入首个字符
boolean flag = false;
// 使用 StringBuilder 拼接
StringBuilder stringBuilder = new StringBuilder();
// 如果传入的整数 <0 ,则先在 StringBuilder 中加入一个负号后转换整数的符号,然后正常判断即可,这样最后反转后负号还是存在最前面
if (x < 0) {
stringBuilder.append("-");
x = -x;
}
// 将整数转为字符串
String str = x + "";
// 从字符串的尾部向前判断
int now = str.length() - 1;
// 还没进行到字符串头则继续循环
while (now >= 0) {
// 得到当前判断的字符
char ch = str.charAt(now);
// 若前置0还没判断完,则哨兵不变,直接 now--;
if (ch != '0') {
flag = true;
}
// 当哨兵改变后则一个一个加入 stringBuilder
if (flag) {
stringBuilder.append(ch);
}
// 指针前移
now--;
}
// 利用工具类将 stringBuilder 转为int类型,这一步若超出 int 类型范围则会抛出异常
return Integer.parseInt(stringBuilder.toString().trim());
} catch (Exception e) {
// 若捕获到异常返回 0
return 0;
}
}
}