以下是 LeetCode 8. 字符串转换整数 (atoi) 的 Golang 实现,包含详细的溢出处理逻辑:
```go
func myAtoi(s string) int {
i, n := 0, len(s)
// 1. 跳过前导空格
for i < n && s[i] == ' ' {
i++
}
// 2. 处理正负号
sign := 1
if i < n {
switch s[i] {
case '+':
i++
case '-':
sign = -1
i++
}
}
// 定义 32 位整数范围常量,避免导入 math 包
const (
maxInt32 = 1<<31 - 1
minInt32 = -1 << 31
)
result := 0
// 3. 逐位解析数字
for i < n && s[i] >= '0' && s[i] <= '9' {
digit := int(s[i] - '0')
// 4. 溢出检查:在累加前判断 result*10 + digit 是否超过 MaxInt32
if result > (maxInt32-digit)/10 {
if sign == 1 {
return maxInt32
}
return minInt32
}
result = result*10 + digit
i++
}
return sign * result
}
```
---
算法思路
1. 跳过前导空格:循环移动索引,直到遇到非空格字符。
2. 处理符号:检查当前字符是否为 '+' 或 '-',记录正负号。
3. 解析数字:循环读取连续的数字字符,将其转换为整数。
4. 溢出处理:
· 在每次累加前,判断 result 是否会因为 result*10 + digit 而超过 MaxInt32。
· 若溢出,根据正负号返回 MaxInt32 或 MinInt32。
5. 返回结果:将符号与最终数字相乘。
---
复杂度分析
· 时间复杂度:O(n),其中 n 是字符串长度,只需一次遍历。
· 空间复杂度:O(1),只使用常数级额外空间。
---
测试用例
输入 输出
"42" 42
" -42" -42
"4193 with words" 4193
"words and 987" 0
"-91283472332" -2147483648
该实现完全符合题目要求,可以正确处理所有边界情况。