整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题解(1个错解没考虑整数越界的情况)
1.x > 0 flag = 1; x < 0 flag = -1;
2.对x取绝对值
3.将x递归对10取余将其从低位到高位的数存到Integer列表中
4.逆向访问列表
public int reverse(int x) {
ArrayList<Integer> list = new ArrayList<>();
int sum = 0, flag = 1;
if (x < 0){
flag = -1;
}
x = Math.abs(x);
while (x >= 10){
int b = x % 10;
list.add(b);
x = x /10;
}
list.add(x);
int j= 1;
for (int i = list.size() - 1; i >= 0; i--){
sum += j * list.get(i);
j *= 10;
}
return sum * flag;
}
正解(应该考虑上整数是否越界)
temp = x % 10;
x /= 10;
sum = sum * 10 + temp;
1.如果 sum ⋅ 10 + temp 导致溢出,那么一定有 sum ≥ Integer.MAX_VALUE / 10
2.如果 sum > Integer.MAX_VALUE / 10,那么 sum ⋅ 10+temp 一定会溢出。
3.如果 sum == Integer.MAX_VALUE / 10,那么只要temp > 7,sum ⋅ 10+temp 就会溢出。
public int reverse(int x) {
int sum = 0;
while (x != 0){
int temp = x % 10;
x = x / 10;
if (sum > Integer.MAX_VALUE / 10 || sum == Integer.MAX_VALUE && temp > 7)
return 0;
if (sum < Integer.MIN_VALUE / 10 || sum == Integer.MIN_VALUE && temp < -8)
return 0;
sum = sum * 10 + temp;
}
return sum;
}