题目
给你一个 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 末尾的数字 currentNumcurrentNum = x % 10x /= 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 的绝对值大等于 10while (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 位,使个位为 0result = 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;}}

