Leetcode之7-整数反转(Reverse Integer)

算法题

题干

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

示例

1
2
3
4
5
6
7
8
9
10
11
示例 1:
输入: 123
输出: 321

示例 2:
输入: -123
输出: -321

示例 3:
输入: 120
输出: 21

注意

假设我们的环境只能存储得下32位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回0。

Java代码

解法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int reverse(int x) {
final int RADIX_TEN = 10;
while (x != 0 && x % RADIX_TEN == 0) {
x /= RADIX_TEN;
}
boolean negative = x < 0;
String y = negative ? String.valueOf(-x) : String.valueOf(x);
int i = 0, j = y.length() - 1;
char[] yChar = y.toCharArray();
while (i < j) {
char temp = yChar[i];
yChar[i] = yChar[j];
yChar[j] = temp;
i++;
j--;
}
String data = new String(yChar);
try {
return Integer.parseInt(negative ? "-" + data : data);
} catch (final NumberFormatException e) {
return 0;
}
}

说明

解法1比较容易想到, 双指针首尾进行交换。不过本道题需要注意溢出问题以及原整数末位是0的情况。

代码解析

  1. 第3-5行代码是将原整数末尾0去除, 对应示例3。
  2. 6-7行代码是考虑负数这种case。
  3. 最后6行代码抛出异常是基于整数溢出问题的考虑。

解法2

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

说明

开始是没想到这种解法, 在看leetcode评论时发现的。 仔细考虑这种算法, 其实是基于正常反转整数的思路整理出来的。

代码解析

  1. ret变量表示旧的反转中间值。
  2. temp表示新的翻转中间值。
  3. 依次提取x的末位加入temp, 如果发生溢出则通过temp/10无法得到上一轮的翻转结果ret。
如果有任何错误或疑问, 欢迎小伙伴们评论区留言^-^
( 完 )

欢迎各位看官关注

麻辣烫,走起
0%