从暴力到滑动窗口全解析——力扣8. 字符串转换整数 (atoi)

力扣8. 字符串转换整数 (atoi)


【LeetCode题解】8. 字符串转换整数 (atoi) ------ Java详细讲解与实现


一、题目描述

请你来实现一个 myAtoi(String s) 函数,使其能将字符串转换成一个 32 位有符号整数,算法流程如下:

  1. 丢弃前导空格 :读入字符串并忽略开头所有空格 ' '
  2. 判断符号 :如果下一个字符是 '+''-',则记录符号;否则默认是正数。
  3. 读取数字部分:从当前位置开始,连续读取数字字符并转换为整数。
  4. 遇到非数字或字符串末尾停止
  5. 溢出截断 :若结果超出 32 位有符号整数范围 [−2³¹, 2³¹ − 1],则返回对应边界值。

二、示例

输入 输出 说明
"42" 42 直接转换
" -042" -42 忽略空格和前导零
"1337c0d3" 1337 遇到非数字停止
"0-1" 0 数字后出现符号停止
"words and 987" 0 非数字开头返回 0

三、解题思路

这道题看似简单,但关键在于正确处理各种边界情况。我们可以将整个流程拆分为以下几个步骤:


1. 跳过前导空格

使用指针 i 从头遍历字符串,直到遇到第一个非空格字符。

java 复制代码
while (i < n && s.charAt(i) == ' ') {
    i++;
}
if (i == n) return 0; // 全是空格

2. 处理符号

判断当前字符是否为 '+''-',并设置符号变量 sign

java 复制代码
int sign = 1;
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
    sign = (s.charAt(i) == '-') ? -1 : 1;
    i++;
}

3. 读取数字并防止溢出

逐位读取数字字符,转换为整数 digit,并实时判断是否会溢出。

java 复制代码
int result = 0;
while (i < n && Character.isDigit(s.charAt(i))) {
    int digit = s.charAt(i) - '0';

    // 判断是否会溢出
    if (result > (Integer.MAX_VALUE - digit) / 10) {
        return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    }

    result = result * 10 + digit;
    i++;
}

4. 返回最终结果

计算并返回带符号的结果。

java 复制代码
return result * sign;

四、完整 Java 实现

java 复制代码
class Solution {
    public int myAtoi(String s) {
        int i = 0, n = s.length();
        int sign = 1;
        int result = 0;

        // 1. 跳过前导空格
        while (i < n && s.charAt(i) == ' ') {
            i++;
        }
        if (i == n) return 0;

        // 2. 处理符号
        if (s.charAt(i) == '+' || s.charAt(i) == '-') {
            sign = (s.charAt(i) == '-') ? -1 : 1;
            i++;
        }

        // 3. 读取数字并判断溢出
        while (i < n && Character.isDigit(s.charAt(i))) {
            int digit = s.charAt(i) - '0';
            if (result > (Integer.MAX_VALUE - digit) / 10) {
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            result = result * 10 + digit;
            i++;
        }

        // 4. 返回最终结果
        return result * sign;
    }
}

五、复杂度分析

项目 分析
时间复杂度 O(n),遍历字符串一次
空间复杂度 O(1),仅使用常量变量

六、常见错误点总结

  1. 忘记处理前导空格:直接从首字符开始解析会出错。
  2. 未考虑正负号:导致结果符号错误。
  3. 数字越界未判断:会导致运行时错误或结果错误。
  4. 读取数字后未停止:可能误解析额外字符。

七、总结

这道题的核心是:
严格按照题意模拟整个转换过程 ,并在每一步都处理边界情况

通过实现 myAtoi,我们不仅锻炼了对字符串处理的熟悉度,也提升了对"溢出控制"与"边界检测"的编程敏感性。

掌握这题之后,对类似的字符串解析类问题(如字符串转浮点数、表达式计算等)会更加得心应手。


相关推荐
米粒14 分钟前
力扣算法刷题 Day 42(股票问题总结)
算法·leetcode·职场和发展
浅念-2 小时前
从LeetCode入门位运算:常见技巧与实战题目全解析
数据结构·数据库·c++·笔记·算法·leetcode·牛客
CoovallyAIHub2 小时前
无人机拍叶片→AI找缺陷:CEA-DETR改进RT-DETR做风电叶片表面缺陷检测,mAP50达89.4%
算法·架构·github
田梓燊2 小时前
leetcode 142
android·java·leetcode
CoovallyAIHub2 小时前
混合训练反而更差?VLM Agent在训练前协调跨数据集标注,文档布局检测F-score从0.860提升至0.883
算法·架构·github
鸿途优学-UU教育2 小时前
教材质量——法考培训的根基与底气
算法
_深海凉_3 小时前
LeetCode热题100-最大数(179)
算法·leetcode·职场和发展
剑挑星河月3 小时前
763.划分字母区间
数据结构·算法·leetcode
小辉同志3 小时前
74. 搜索二维矩阵
c++·leetcode·矩阵·二分查找
programhelp_3 小时前
Snowflake OA 2026 面经|3道高频真题拆解 + 速通攻略
经验分享·算法·面试·职场和发展