LeetCode 第7题:整数反转

本文我们来看看整数翻转大法——LeetCode第7题的解析。

引言

大家好!今天我们要解析的是LeetCode的第7题——整数反转。你有没有试过在生活中来一次180度大转弯?今天我们要做的就是让一个整数来个华丽的掉头,从正数变成负数,从123变成321。这听起来是不是很有趣?好了,让我们开始这场神奇的整数翻转之旅吧!

题目描述

给定一个32位的有符号整数,你需要将这个整数中的数字进行反转。如果反转后的整数溢出,则返回0。

示例1:

输入:123
输出:321

示例2:

输入:-123
输出:-321

示例3:

输入:120
输出:21

注意:假设我们的环境只能存储得下32位的有符号整数,其数值范围是 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后的整数溢出则返回0。

解题思路

  1. 初始化变量:定义一个变量 rev 来存储反转后的数字。
  2. 循环反转:通过循环,每次从原整数 x 末尾取一位数字,追加到 rev 的末尾。
  3. 处理溢出:在每次添加新数字前,检查是否会导致溢出。
  4. 返回结果:最后返回 rev

实现代码

public class ReverseInteger {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            // 检查是否会溢出
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }

    public static void main(String[] args) {
        ReverseInteger reverseInteger = new ReverseInteger();
        System.out.println(reverseInteger.reverse(123));  // 321
        System.out.println(reverseInteger.reverse(-123)); // -321
        System.out.println(reverseInteger.reverse(120));  // 21
        System.out.println(reverseInteger.reverse(1534236469)); // 0 (溢出)
    }
}

解题过程可视化

使用Mermaid语法来展示这个过程,如下图所示:

不会溢出
会溢出
x 为 0
输入整数 x
初始化 rev = 0
循环 x 不等于 0
取出 x 的末尾数字 pop = x % 10
更新 x = x / 10
检查 rev 溢出
rev = rev * 10 + pop
返回 rev

例子讲解

例子1:整数 123
  1. 初始状态

    • x = 123
    • rev = 0
  2. 第一次循环

    • pop = 123 % 10 = 3
    • x = 123 / 10 = 12
    • rev = 0 * 10 + 3 = 3
  3. 第二次循环

    • pop = 12 % 10 = 2
    • x = 12 / 10 = 1
    • rev = 3 * 10 + 2 = 32
  4. 第三次循环

    • pop = 1 % 10 = 1
    • x = 1 / 10 = 0
    • rev = 32 * 10 + 1 = 321
  5. 结束循环

    • x = 0
    • 返回 rev = 321
例子2:整数 -123
  1. 初始状态

    • x = -123
    • rev = 0
  2. 第一次循环

    • pop = -123 % 10 = -3
    • x = -123 / 10 = -12
    • rev = 0 * 10 + (-3) = -3
  3. 第二次循环

    • pop = -12 % 10 = -2
    • x = -12 / 10 = -1
    • rev = -3 * 10 + (-2) = -32
  4. 第三次循环

    • pop = -1 % 10 = -1
    • x = -1 / 10 = 0
    • rev = -32 * 10 + (-1) = -321
  5. 结束循环

    • x = 0
    • 返回 rev = -321
例子3:整数 120
  1. 初始状态

    • x = 120
    • rev = 0
  2. 第一次循环

    • pop = 120 % 10 = 0
    • x = 120 / 10 = 12
    • rev = 0 * 10 + 0 = 0
  3. 第二次循环

    • pop = 12 % 10 = 2
    • x = 12 / 10 = 1
    • rev = 0 * 10 + 2 = 2
  4. 第三次循环

    • pop = 1 % 10 = 1
    • x = 1 / 10 = 0
    • rev = 2 * 10 + 1 = 21
  5. 结束循环

    • x = 0
    • 返回 rev = 21
例子4:整数 1534236469 (溢出)
  1. 初始状态

    • x = 1534236469
    • rev = 0
  2. 第一次循环

    • pop = 1534236469 % 10 = 9
    • x = 1534236469 / 10 = 153423646
    • rev = 0 * 10 + 9 = 9
  3. 第二次循环

    • pop = 153423646 % 10 = 6
    • x = 153423646 / 10 = 15342364
    • rev = 9 * 10 + 6 = 96
  4. 后续循环…

    • (略去中间过程)
  5. 第九次循环

    • pop = 1
    • rev = 964632435
    • rev * 10 + pop = 9646324350 + 1 = 9646324351 (溢出)
  6. 溢出检测

    • 溢出,返回 0

总结

通过这几个例子,我们可以看到整数反转的过程实际上是不断地取出原整数的末尾数字,添加到新数字的末尾。需要特别注意的是整数溢出的处理,这也是这道题的难点之一。

结尾

整数反转是一道有趣的题目,通过这道题目,我们不仅学会了如何操作整数,还掌握了如何处理溢出情况。希望这篇博客能够帮助你更好地理解这道题目。

如果本文对您有所帮助的话,请收藏文章、关注作者、订阅专栏,感激不尽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gemini技术窝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值