1. 字符串转整数(atoi)问题解析
字符串转整数(atoi)是编程面试中的经典问题,也是实际开发中经常遇到的场景。这个问题看似简单,但需要考虑各种边界条件和特殊情况。我曾在多个项目中处理过类似的需求,比如从用户输入、配置文件或网络请求中提取数字信息。
atoi的核心挑战在于:如何正确处理字符串中的非数字字符、处理正负号、处理溢出情况,以及跳过前导空格。这些问题在实际业务场景中经常出现,比如处理用户表单输入时,用户可能会输入" -42abc"这样的字符串,我们需要从中正确提取出-42这个数值。
2. 问题需求与边界条件
2.1 基本转换规则
atoi函数需要遵循以下转换规则:
- 忽略字符串前面的空白字符(' ')
- 读取可选的正负号('+'或'-')
- 读取连续的数字字符,将其解释为数值
- 如果在数字后面出现非数字字符,则忽略这些字符
- 如果字符串为空或仅包含空白字符,或者第一个非空白字符不是有效数字,则返回0
注意:这里的空白字符特指ASCII空格' '(0x20),不包括其他空白字符如\t、\n等
2.2 边界条件处理
在实际实现中,需要特别注意以下边界情况:
- 字符串为空或全为空格
- 字符串以非数字字符开头(除空格和正负号外)
- 字符串中包含多个正负号
- 转换后的数值超出32位有符号整数范围[-2³¹, 2³¹-1]
- 字符串中间包含非数字字符
- 前导零的处理
3. 算法实现与优化
3.1 基础实现步骤
以下是atoi的标准实现步骤:
- 初始化索引i=0,跳过所有前导空格
- 处理可选的正负号
- 遍历后续字符,直到遇到非数字字符或字符串结束:
- 将当前数字字符转换为数字
- 检查是否会溢出:在每次累加前判断
- 根据正负号返回最终结果
python复制def myAtoi(s: str) -> int:
i, n = 0, len(s)
sign = 1
result = 0
# 跳过前导空格
while i < n and s[i] == ' ':
i += 1
# 处理正负号
if i < n and s[i] == '+':
