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

相关推荐
leobertlan2 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的3 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1233 小时前
答案daanC语言
数据结构·算法
Navigator_Z5 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li6 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔7 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔7 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生7 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川7 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课7 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析