LeetCode算法题:7. 整数反转

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

如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

提示:

  • -2^31 <= x <= 2^31 - 1

读题后的疑惑点:

  1. Java中的各个数据类型的范围分别是什么,针对这一题中特别研究整数类型的范围。
  2. 如何限制整数的范围为 -2^31 <= x <= 2^31 - 1

解答:

1.Java各数据类型的范围

针对该题是int的范围

我的题解思路:

首先判断给定的值是否在-2^31 <= x <= 2^31 - 1范围内,如果不在,则直接返回0,在的话则每次除10取余,将余数再乘以10加上下一位,直到原数变成0。

代码:

java 复制代码
class Solution {
    public int reverse(int x) {
        if (x<Integer.MIN_VALUE || x>Integer.MAX_VALUE){
            return 0;
        }else{
            int i = x;
            int a=0;// 用来接收余数
            int result = 0;
            while (i!=0){
                result = result*10 + a;
                a = i%10;
                i = i/10;
            }
            result = result*10 + a;
            return result;
        }
    }
}

存在bug:

错误原因,在计算过程中发生了内存泄漏,也就是964632435*10超过了int类型的范围,而不存在检测逻辑导致出错。因此,在每次计算后判断时候正确的计算了,如果计算后的值-a/10不等于上一步的result,则说明内存泄漏,返回0。

修改后的题解:

java 复制代码
class Solution {
    public int reverse(int x) {
        if (x<Integer.MIN_VALUE || x>Integer.MAX_VALUE){
            return 0;
        }else{
            int i = x;
            int a=0;// 用来接收余数
            int result = 0,pre;
            while (i!=0){
                pre = result;
                result = result*10 + a;
                if ((result - a)/10!=pre) { // 通过还原上一步的值判断是否发生内存泄漏
                    return 0;
                }
                a = i%10;
                i = i/10;
            }
            pre = result;
            result = result*10 + a;
            if ((result - a)/10!=pre) { 
                return 0;
            }
            return result;
        }
    }
}

官方题解:

java 复制代码
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;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-integer/solutions/755611/zheng-shu-fan-zhuan-by-leetcode-solution-bccn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其在判断数组内存泄漏时很聪明的使用了最大和最小的int数值/10与原值判断,这样就不需要再进行复原和存储上一次值的操作,同时它把计算的步骤放在了取余数之前。

相关推荐
可编程芯片开发9 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星9 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮9 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84079 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>10 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC11 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC11 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师11 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水11 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_250111 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解