题目描述
思路解析动画文字版
核心就一句话:把字符串当流水线,分四个阶段往后扫。遇到不属于当前阶段的字符,就立刻停手。
阶段 1 · 跳过前导空格:先认台上的格子:放的就是字符本身——三个空格、一个减号、再加 4 和 2。紫框是指针 i,现在停在第 0 格。
阶段 1 · 跳过前导空格:前三格都是空格,循环让 i 连跳三下。蓝色是跳掉的空格,紫框(i)正好停在第 3 格的减号上——第一个不是空格的字符。
阶段 2 · 读取符号(只读一次):紫框正停在第 3 格,是个减号。把 sign 记成 -1,然后 i 前进到 4。符号只在这儿判一次,之后绝不再看。
阶段 3 · 读第一位数字 '4':紫框停在第 4 格,是字符 4。老的 ans 先乘 10 腾出个位,再加上 4,得到 4。这是「逐位拼数」的标准动作。
阶段 3 · 读第二位数字 '2':紫框停在第 5 格,是字符 2。ans 再乘 10 进位,加上 2,变成 42。每多一位,就「乘十再加」一次。
阶段 3 · 遇非数字,停:把「停」演出来:假设第 6 格是个灰色字母 a。紫框探到它,一判——不是数字,于是不读、不加、直接退出循环。ans 停在 42。
阶段 4 · 乘符号 + 钳范围:最后一步:ans 乘上 sign 得 -42(紫色是吃进答案的减号和 42)。它在 32 位范围内,不用夹,直接返回 -42。整道题收工。
慢镜头回放 · 一图看懂:把全过程压成一帧:蓝色是被跳掉的三个空格,紫色是真正吃进答案的减号和 42。三个变量各管一摊,互不打架。
一句话记住:空格 → 符号 → 数字 → 钳制,四步顺序走。任何阶段遇到不该出现的字符,就地停,绝不回头找。
三个高频追问:long 防溢出、遇非数字必须停的语义、符号只读一次的实现。
迁移阶梯:把这套四阶段扫描练熟,再上更复杂的字符串解析:LC65 有效数字(状态更多)、LC394 字符串解码(用栈管嵌套)、LC224 基本计算器(运算符加括号的状态机)。卡住就问问 AI 助教小欧,或去通关训练里实战一遍。
边界三连:三个边界:前导空格照跳、非数字截断、没有有效数字就返回 0。加上小测里的溢出钳制,四种坑全覆盖。
参考代码
class Solution: def myAtoi(self, s: str) -> int: i, n = 0, len(s) while i < n and s[i] == ' ': # 阶段1 跳空格 i += 1 sign = 1 if i < n and s[i] in '+-': # 阶段2 读符号 if s[i] == '-': sign = -1 i += 1 ans = 0 while i < n and s[i].isdigit(): # 阶段3 读数字 ans = ans * 10 + int(s[i]) i += 1 ans *= sign return max(-2**31, min(2**31 - 1, ans)) # 阶段4 钳范围复杂度
- 时间复杂度:O(n),四个阶段加起来,每个字符最多被看一次,n 个字符就是 O(n)
- 空间复杂度:O(1),全程只用 i、sign、ans 三个变量,不随输入长度增长
可套用的代码模板
把这套骨架记成「跳前缀 → 读一次性标记 → 连续读主体到非法即停 → 收尾」。Python 留了空让你自己填条件,C++/Java 演示「边读边钳」防溢出,迁到别的解析题改三处条件即可。
def parse(s): i, n = 0, len(s) # 阶段1:跳掉开头不要的字符(这里是空格) while i < n and s[i] == ' ': i += ___ # 填:i 怎么前进 # 阶段2:读一次性的标记(这里是正负号) sign = 1 if i < n and s[i] in '+-': sign = ___ # 填:'-' 时取 -1,否则 +1 i += 1 # 阶段3:连续读主体,遇到不合法就停 ans = 0 while i < n and ___: # 填:当前阶段的合法条件 ans = ans * 10 + int(s[i]) i += 1 # 阶段4:收尾(这里是乘符号 + 钳范围) return ___ # 填:clamp(ans*sign)易错点
面试追问把动画讲成自己的话
追问C++ 或 Java 里怎么防止读数字时整型溢出?
追问为什么读到第一个非数字字符就必须停,不能跳过它继续往后找数字?
追问怎么保证正负号只会被读一次?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最长公共前缀
LeetCode 14 · 简单 · 沿着 数组 & 哈希 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题