给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1: 输入: 123 输出: 321
示例 2: 输入: -123 输出: -321
示例 3: 输入: 120 输出:21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31 ^,231 −1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
- 主要是解决溢出问题,这是我考虑不周到的地方: 解决溢出问题有两个思路:
- 第一个思路是通过字符串转换加try~catch的方式来解决;
- 第二个思路就是通过数学计算来解决。
第一种方法(自己第一次做的思路):
(1)考虑为0情况:如果x=0,直接返回0
(2)x>0,则布尔型变量flag=true;x<0,则flag为false;
(3)为了更方便,记录了flag之后,取x的绝对值;
(4)将数字拆分,依次加入动态数组;
(5)考虑到反转之后,前面如果有一个或多个为0的,则需要去0;
(6)当前面没有0之后,就继续将数组中的数字取出来,以String的形式,后面转为int型即可。
(7)捕获异常:反转后整数溢出要返回 0;
(8)最后判断flag,决定返回的d是正还是负。
public int reverse(int x) {
// 判断正负
if (x == 0) {
return 0;
}
boolean flag = false;
if (x > 0) {
flag = true;
}
x = Math.abs(x);
int d = 0;// 返回
// 判断几位数,加入数组
ArrayList<Integer> list = new ArrayList<>();
while (x != 0) {
int a = x % 10;
list.add(a);
x /= 10;
}
String string = new String();
int count = 0;
OUT: for (int i = 0; i < list.size(); i++) {
if (list.get(i) == 0) {
count++;
continue;
}
for (int j = count; j < list.size(); j++) {
string += list.get(j);
}
break OUT;
}
try {
if (Integer.parseInt(string) > Integer.MAX_VALUE) {
return 0;
} else {
d = Integer.parseInt(string);
}
} catch (Exception e) {
return 0;
}
if (!flag) {
d = -d;
}
return d;
}
第二种方法:
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出
class Solution {
public int reverse(int x) {
long temp = 0;
while(x != 0){
int pop = x % 10;
temp = temp * 10 + pop;
if(temp > Integer.MAX_VALUE || temp < Integer.MIN_VALUE){
return 0;
}
x /= 10;
}
return (int)temp;
}
}
end.