题目理解
这道题要求我们实现一个函数,将字符串转换为整数,类似于很多编程语言中的 `atoi` 函数。
解题思路
我们可以将解题过程分为以下几个步骤:
1. **处理前导空格**
- 使用 `lstrip()` 方法去除字符串开头的空格
2. **处理符号**
- 检查第一个字符是否为 '+' 或 '-'
- 如果是 '-',记录符号为负
- 如果是 '+',记录符号为正
- 如果都不是,默认为正
3. **提取数字**
- 从符号后的位置开始遍历字符串
- 遇到非数字字符就停止
- 将每个数字字符转换为对应的数值,并累加到结果中
4. **处理边界情况**
- 32位整数的范围是 [-2^31, 2^31-1]
- 如果结果超出这个范围,需要返回对应的边界值
代码讲解
让我们逐步分析代码的实现:
def myAtoi(self, s: str) -> int:
# 1. 处理前导空格
s = s.lstrip() # 去除字符串左边的所有空格
if not s: # 如果处理完空格后字符串为空,直接返回0
return 0
# 2. 处理符号
sign = 1 # 默认为正数
start = 0 # 开始处理数字的位置
if s[0] == '-': # 如果第一个字符是负号
sign = -1 # 记录负号
start = 1 # 从第二个字符开始处理数字
elif s[0] == '+': # 如果第一个字符是正号
start = 1 # 从第二个字符开始处理数字
# 3. 处理数字
num = 0
for i in range(start, len(s)):
if not s[i].isdigit(): # 如果遇到非数字字符,立即停止
break
# 将当前数字乘以10(向左移一位)并加上新的数字
num = num * 10 + int(s[i])
# 4. 添加符号
num = sign * num
# 5. 处理边界情况
return max(min(num, 2**31 - 1), -2**31) # 确保结果在32位整数范围内
示例演示
让我们用一个例子来说明整个过程:
输入:s = " -42"步骤1:去除空格后 → "-42"
步骤2:检测到负号,sign = -1,start = 1
步骤3:遍历数字
- 第一次循环:num = 0 * 10 + 4 = 4
- 第二次循环:num = 4 * 10 + 2 = 42
步骤4:添加符号 num = -42
步骤5:-42在范围内,直接返回
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串的长度
- 空间复杂度:O(1),只使用了常数级别的额外空间
注意事项
1. 要注意处理空字符串的情况
2. 注意处理正负号
3. 遇到非数字字符要立即停止
4. 不要忘记处理整数溢出的情况
这道题虽然看起来简单,但需要考虑的边界情况比较多,是一道很好的字符串处理练习题。