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

相关推荐
饼干哥哥33 分钟前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者2 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者2 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月5 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星6 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星6 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC21 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与1 天前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络1 天前
论最小 Agent 计算机的形态
算法