LeetCode【7、整数反转】(简单)

题目描述

这是 LeetCode 上的 这是 LeetCode 上的 7. 整数反转,难度为 简单

关键字:数字反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [-231, 231 – 1],就返回 0

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321
复制代码

示例 2:

输入:x = -123
输出:-321
复制代码

示例 3:

输入:x = 120
输出:21
复制代码

示例 4:

输入:x = 0
输出:0
复制代码

提示:

-231 <= x <= 231 – 1

划重点

  1. 数字有负数
  2. 反转之后的数字有大小限制,不能超过 int 类型的范围

解题思路

首先对一个整数反转的时候,我们可以先获取到最后一位,作为第一位存储,之后每次拿数的时候往前一位,最终的数字 = 之前的数字 * 10 + 当前压入的数字。

class Solution {
    public int reverse(int x) {
        // 定义反转之后的数字
        int ans = 0;
        int tmp;
        while (x != 0) {
            // 取最后一位数字
            tmp = x % 10;
            // 计算反转之后的数字
            ans = ans * 10 + tmp;
            // 去掉整数的最后一位
            x /= 10;
        }
        return ans;
    }
}
复制代码

这样基础代码我们就有了,但是我们发现,反转之后的数字可能会溢出,即超出了整形 Integer 的范围。

所以我们继续看上述代码,看是哪一步可能会出现问题,我们可以定位到 ans = ans * 10 + x % 10;

  1. 对于正数:溢出的表达式为 ans * 10 + x % 10 > Integer.MAX_VALUE,对这个不等式转换求出反转结果溢出时上一步 ans 的范围应该是 ans > (Integer.MAX_VALUE - x % 10) / 10

  2. 对于负数:溢出的表达式为 ans * 10 + x % 10 < Integer.MIN_VALUE,同样进行转换得到 ans < (Integer.MIN_VALUE - x % 10) / 10

完整代码有:

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            if (x > 0 && ans > (Integer.MAX_VALUE - x % 10) / 10) {
                return 0;
            }
            if (x < 0 && ans < (Integer.MIN_VALUE - x % 10) / 10) {
                return 0;
            }
            ans = ans * 10 + x % 10;
            x /= 10;
        }
        return ans;
    }
}
复制代码

引用

我的 github 仓库已经同步建立,点击访问

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享