全部测试用例通过 ✅。下面是完整实现和讲解。
核心思路
按题意分4 步走,用指针i从左到右扫描:
去前导空格:跳过所有
' '读符号:遇到
'+'或'-',记录sign(默认+1),无符号也算合法读数字:只要当前字符是数字就累加,
result = result * 10 + digit遇非数字立即停止(即使后面还有字符,如
"4193 with words")
关键:读到第一个非数字字符就结束,而不是跳过继续读。
越界处理(易错点)
题目要求落在32 位有符号整数范围内:[-2³¹, 2³¹-1],即[-2147483648, 2147483647]。
如果在累加完才判断,Python 虽然不会真溢出,但逻辑上应在乘法前提前判断:
if result > (INT_MAX - digit) // 10: return INT_MAX if sign == 1 else INT_MIN这种"先判断再累加"的技巧,是 atoi 的标准写法,也避免了临时值超过 INT_MAX。
完整代码
class Solution: def myAtoi(self, s: str) -> int: INT_MIN, INT_MAX = -2 ** 31, 2 ** 31 - 1 i, n = 0, len(s) # 1. 跳过前导空格 while i < n and s[i] == ' ': i += 1 # 2. 读取正负号(可选) sign = 1 if i < n and s[i] in ('+', '-'): sign = -1 if s[i] == '-' else 1 i += 1 # 3. 读取数字字符 result = 0 while i < n and s[i].isdigit(): digit = ord(s[i]) - ord('0') # 提前判断是否越界 if result > (INT_MAX - digit) // 10: return INT_MAX if sign == 1 else INT_MIN result = result * 10 + digit i += 1 return sign * result几个细节提醒
空串 / 只有空格 / 只有
'-':result保持0,直接返回0,正确 ✅'+0 123':读完0后遇到空格停止,返回0✅时间复杂度O(n),空间O(1)
测试结果覆盖了正数、负数、前导空格、夹带字母、正负溢出、无数字等各种边界情况,均符合预期。
需要的话我可以再补充正则单行版(代码更短)或逐行注释版方便理解。