前言
个人网站
公众号: 北京程序猿, 网站 : https://yaml.vip
算法题
题干
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意
假设我们的环境只能存储得下32位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回0。
Java代码
解法1
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的情况。
代码解析
- 第3-5行代码是将原整数末尾0去除, 对应示例3。
- 6-7行代码是考虑负数这种case。
- 最后6行代码抛出异常是基于整数溢出问题的考虑。
解法2
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评论时发现的。 仔细考虑这种算法, 其实是基于正常反转整数的思路整理出来的。
代码解析
- ret变量表示旧的反转中间值。
- temp表示新的翻转中间值。
- 依次提取x的末位加入temp, 如果发生溢出则通过temp/10无法得到上一轮的翻转结果ret。
本文著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!
作者:北京程序猿
链接:整数反转