元宝 LeetCode 8.字符串转换整数(atoi) Python3实现
2026/9/18 0:18:46 网站建设 项目流程

全部测试用例通过 ✅。下面是完整实现和讲解。

核心思路

按题意分4 步走,用指针i从左到右扫描:

  1. 去前导空格:跳过所有' '

  2. 读符号:遇到'+''-',记录sign(默认+1),无符号也算合法

  3. 读数字:只要当前字符是数字就累加,result = result * 10 + digit

  4. 遇非数字立即停止(即使后面还有字符,如"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)

测试结果覆盖了正数、负数、前导空格、夹带字母、正负溢出、无数字等各种边界情况,均符合预期。

需要的话我可以再补充正则单行版(代码更短)或逐行注释版方便理解。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询