7. 整数反转

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例1:

1
2
输入: 123
输出: 321

示例2:

1
2
输入: -123
输出: -321

示例3:

1
2
输入: 120
输出: 21

解法

解法一:

反向取数字的每一位,相加

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int reverse(int x) {
int res = 0;

while (x != 0) {
res = res * 10 + x % 10;
x /= 10;
}

return res;
}
};

但是,当输入是1534236469时,反转之后的数值就会溢出,造成结果不对。

那么,就需要在循环中判断res在什么时候可能溢出,如果溢出的话,就直接返回0。

在Java中,int的取值范围为-2147483648~2147483647。那么只要在res乘以10之前,判断res是否可能溢出即可。

分四种情况:

  1. res 大于Integer.MAX_VALUE / 10,此时res * 10之后一定会溢出,返回0;
  2. res等于Integer.MAX_VALUE / 10,并且,下一个待加的数字pop大于7,res * 10 + pop 一定会溢出,返回0;
  3. res小于Integer.MIN_VALUE / 10,此时res * 10之后一定会溢出,返回0;
  4. res等于Integer.MIN_VALUE / 10,并且,下一个待加的数字pop小于-8,res * 10 + pop一定会溢出,返回0;

以下是修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int reverse(int x) {
int res = 0;

while (x != 0) {
int pop = x % 10;
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && pop > 7)) {
return 0;
}
if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && pop < -8)) {
return 0;
}

res = res * 10 + pop;
x /= 10;
}

return res;
}

解法二:

反向取数字相加,在循环的过程中,判断数字是否溢出。

当ans * 10 / 10 != ans时,数字溢出

ans = ans * 10 + x % 10 是不会溢出的,ans * 10 得到的数是以0结尾的,而x % 10得到的数只能是0-9,因此两者相加不会产生进位。

Java

1
2
3
4
5
6
7
8
9
10
11
12
public int reverse(int x) {
int ans = 0;
while (x != 0) {
if ((ans * 10) / 10 != ans) {
ans = 0;
break;
}
ans = ans * 10 + x % 10;
x = x / 10;
}
return ans;
}
0%