题目

给你一个 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。

在不使用辅助栈或数组的情况下,要实现 [ 弹出 ] 和 [ 推入 ] ,我们可以使用下面的数学方法:

  1. // 弹出 x 末尾的数字 currentNum
  2. currentNum = x % 10
  3. x /= 10
  4. // 将数字 currentNum 推入 result 末尾
  5. result = result * 10 + currentNum

题目需要判断反转后的数字 result 是否超过 32 位有符号整数的范围,-2 <= x <= 2 - 1

因此,可以在推入或推出前检查是否超限。

答案

1、模拟出入栈

手写的

这个是我自己手写的,判断是否超限使用的是先加,再判断个位数是否和加前一样。

  1. class Solution {
  2. public int reverse(int x) {
  3. // 结果
  4. int result = 0;
  5. // 存储当前循环处理的数 ( x 的个位 )
  6. int currentNum = 0;
  7. // 如果 x 的绝对值大等于 10
  8. while (Math.abs(x) > 10) {
  9. // 取 x 的个位填充到 result 的个位,result 原本的数字全部左移一位
  10. currentNum = x % 10;
  11. result = result * 10 + currentNum;
  12. //检查 result 是否超限
  13. if (result % 10 != currentNum) {
  14. return 0;
  15. }
  16. // 令 x 等于 x 去掉个位上的数
  17. x /= 10;
  18. }
  19. // 【特殊情况处理,使之与正常情况相同便于下面处理】
  20. // 如果 result 的绝对值不为 0 ,且 x 的绝对值为 10 ,说明 x 是以 -10 或 10 开头的数字
  21. if (Math.abs(result) != 0 && (Math.abs(x) == 10)) {
  22. // 将 result 先左移 1 位,使个位为 0
  23. result = result * 10 + 0;
  24. }
  25. // 如果 x 的绝对值为 10 ,说明此时 x 为 10 或 -10 ,只需要将 x/10 加到 result 的个位就算处理完成,所以让 currentNum 为 1 即可。
  26. if (Math.abs(x) == 10) {
  27. currentNum = x / 10;
  28. } else {
  29. currentNum = x;
  30. }
  31. result = result * 10 + currentNum;
  32. //检查超限
  33. if (result % 10 != currentNum) {
  34. return 0;
  35. }
  36. return result;
  37. }
  38. }

image.png

官方题解

超限判断表达式由使用公式推导出来

  1. class Solution {
  2. public int reverse(int x) {
  3. int rev = 0;
  4. while (x != 0) {
  5. if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
  6. return 0;
  7. }
  8. int digit = x % 10;
  9. x /= 10;
  10. rev = rev * 10 + digit;
  11. }
  12. return rev;
  13. }
  14. }

image.png