多解法详解与边界处理——力扣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 之前的检测。
  • 逐位反转法 是首选,性能最佳;
  • 字符串法 适合理解,但不满足常数额外空间的要求。

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


相关推荐
仰泳的熊猫10 小时前
1037 Magic Coupon
数据结构·c++·算法·pat考试
AI科技星10 小时前
质量定义方程的物理数学融合与求导验证
数据结构·人工智能·算法·机器学习·重构
HY小宝F10 小时前
软件开发的两面镜子:效率陷阱与质量盲区的深度思考
职场和发展
小羊学伽瓦11 小时前
ThreadLocal
java·jvm·算法
程芯带你刷C语言简单算法题11 小时前
Day30~实现strcmp、strncmp、strchr、strpbrk
c语言·学习·算法·c
桓峰基因11 小时前
SCS 60.单细胞空间转录组空间聚类(SPATA2)
人工智能·算法·机器学习·数据挖掘·聚类
天赐学c语言11 小时前
12.17 - 合并两个有序数组 && include<> 和 include““ 的区别
c++·算法·leecode
摇摆的含羞草11 小时前
Java加解密相关的各种名词的含义,各种分类的算法及特点
java·开发语言·算法
im_AMBER11 小时前
Leetcode 79 最佳观光组合
笔记·学习·算法·leetcode
高山上有一只小老虎11 小时前
小红背单词
java·算法