题目
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2, 2− 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-2 <= x <= 2 - 1
解题思路
1、模拟出入栈
记 result 为翻转后的结果,为了完成翻转,我们可以重复 [ 弹出 ] x 末尾的数字(也就是个位),再将其 [ 推入 ] result 的末尾,直至 x 为 0。
在不使用辅助栈或数组的情况下,要实现 [ 弹出 ] 和 [ 推入 ] ,我们可以使用下面的数学方法:
// 弹出 x 末尾的数字 currentNum
currentNum = x % 10
x /= 10
// 将数字 currentNum 推入 result 末尾
result = result * 10 + currentNum
题目需要判断反转后的数字 result 是否超过 32 位有符号整数的范围,-2 <= x <= 2 - 1
。
因此,可以在推入或推出前检查是否超限。
答案
1、模拟出入栈
手写的
这个是我自己手写的,判断是否超限使用的是先加,再判断个位数是否和加前一样。
class Solution {
public int reverse(int x) {
// 结果
int result = 0;
// 存储当前循环处理的数 ( x 的个位 )
int currentNum = 0;
// 如果 x 的绝对值大等于 10
while (Math.abs(x) > 10) {
// 取 x 的个位填充到 result 的个位,result 原本的数字全部左移一位
currentNum = x % 10;
result = result * 10 + currentNum;
//检查 result 是否超限
if (result % 10 != currentNum) {
return 0;
}
// 令 x 等于 x 去掉个位上的数
x /= 10;
}
// 【特殊情况处理,使之与正常情况相同便于下面处理】
// 如果 result 的绝对值不为 0 ,且 x 的绝对值为 10 ,说明 x 是以 -10 或 10 开头的数字
if (Math.abs(result) != 0 && (Math.abs(x) == 10)) {
// 将 result 先左移 1 位,使个位为 0
result = result * 10 + 0;
}
// 如果 x 的绝对值为 10 ,说明此时 x 为 10 或 -10 ,只需要将 x/10 加到 result 的个位就算处理完成,所以让 currentNum 为 1 即可。
if (Math.abs(x) == 10) {
currentNum = x / 10;
} else {
currentNum = x;
}
result = result * 10 + currentNum;
//检查超限
if (result % 10 != currentNum) {
return 0;
}
return result;
}
}
官方题解
超限判断表达式由使用公式推导出来
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
}