多解法详解与边界处理——力扣7.整数反转


【LeetCode 热题】整数反转 ------ 多解法详解与边界处理

一、题目描述

给定一个 32 位有符号整数 x,将其数字部分进行反转,并返回反转后的整数。

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

注意: 环境不允许存储 64 位整数。

示例

  • 输入:123 → 输出:321
  • 输入:-123 → 输出:-321
  • 输入:120 → 输出:21
  • 输入:0 → 输出:0

二、思路分析

1. 数字逐位反转(核心解法)

  • 利用数学运算:不断对 x % 10 取余得到末尾数字,逐位拼接到结果 res 中;

  • 每次拼接时,先检查是否会溢出 32 位整数范围:

    • 正数溢出条件:res > Integer.MAX_VALUE / 10res == Integer.MAX_VALUE / 10 && digit > 7
    • 负数溢出条件:res < Integer.MIN_VALUE / 10res == Integer.MIN_VALUE / 10 && digit < -8
  • 若即将溢出,直接返回 0。

这是官方推荐的 O(log n) 解法。


2. 字符串反转法(不推荐但直观)

  • 将整数转为字符串;
  • 处理负号,反转数字部分;
  • 转回整数时检查是否溢出。

虽然简单,但需要额外空间,性能不如逐位反转。


三、代码实现

方法一:逐位反转(推荐)

java 复制代码
class Solution {
    public int reverse(int x) {
        int res = 0;
        while (x != 0) {
            int digit = x % 10;
            x /= 10;
            // 检查是否溢出
            if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && digit > 7)) {
                return 0;
            }
            if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && digit < -8)) {
                return 0;
            }
            res = res * 10 + digit;
        }
        return res;
    }
}

方法二:字符串反转法

java 复制代码
class Solution {
    public int reverse(int x) {
        String s = Integer.toString(x);
        boolean negative = s.charAt(0) == '-';
        String numStr = negative ? s.substring(1) : s;

        StringBuilder sb = new StringBuilder(numStr);
        sb.reverse();
        String reversed = negative ? "-" + sb.toString() : sb.toString();

        try {
            return Integer.parseInt(reversed);
        } catch (NumberFormatException e) {
            return 0; // 溢出时返回 0
        }
    }
}

四、复杂度分析

  • 方法一(逐位反转)

    • 时间复杂度:O(log |x|),取决于整数位数。
    • 空间复杂度:O(1)。
  • 方法二(字符串反转)

    • 时间复杂度:O(n),n 为数字位数。
    • 空间复杂度:O(n),需要额外字符串存储。

五、总结

  • 本题的关键点在于 溢出判断 ,尤其是 res * 10 + digit 之前的检测。
  • 逐位反转法 是首选,性能最佳;
  • 字符串法 适合理解,但不满足常数额外空间的要求。

在面试中,建议优先写出 逐位反转法,并清晰解释溢出条件。


相关推荐
v_34836087623 小时前
Android native端 堆栈打印
android·算法
residual_fan3 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea4 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询5 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun616 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun616 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
June bug8 小时前
【HCIA- AI(正课)】3.1.人工智能业务流程
职场和发展
302wanger8 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼8 小时前
CF——错题的集合
算法
SL_staff8 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈