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与原值判断,这样就不需要再进行复原和存储上一次值的操作,同时它把计算的步骤放在了取余数之前。

相关推荐
CoovallyAIHub18 分钟前
方案 | 动车底部零部件检测实时流水线检测算法改进
深度学习·算法·计算机视觉
CoovallyAIHub20 分钟前
方案 | 光伏清洁机器人系统详细技术实施方案
深度学习·算法·计算机视觉
lxmyzzs24 分钟前
【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)
人工智能·opencv·算法·计算机视觉·裂缝检测·yolo12
洋曼巴-young25 分钟前
240. 搜索二维矩阵 II
数据结构·算法·矩阵
楼田莉子2 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
pusue_the_sun2 小时前
数据结构——栈和队列oj练习
c语言·数据结构·算法··队列
大锦终2 小时前
【算法】模拟专题
c++·算法
Xの哲學3 小时前
Perf使用详解
linux·网络·网络协议·算法·架构
想不明白的过度思考者3 小时前
数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
数据结构·算法·排序算法
小七rrrrr3 小时前
动态规划法 - 53. 最大子数组和
java·算法·动态规划