8.字符串转换整数 (atoi)
题目
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s) 的算法如下:
- 空格:读入字符串并丢弃无用的前导空格(" ")
- 符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
- 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
- 舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。 返回整数作为最终结果。
解题
解题步骤:
- 忽略前导空格。
- 处理正负号。
- 读取数字字符,直到遇到非数字字符或字符串结束。
- 处理整数溢出和下溢。
- 返回最终的整数结果。
go
func myAtoi(s string) int {
i, l := 0, len(s)
// 忽略前导空格
for i < l && s[i] == ' ' {
i++
}
// 处理正负号
sign := 1
if i < l && (s[i] == '-' || s[i] == '+') {
if s[i] == '-' {
sign = -1
}
i++
}
var result int
for i < l {
digit := int(s[i] - '0')
// 非数字字符跳出结束
if digit < 0 || digit > 9 {
break
}
// 处理整数溢出和下溢
if result > (math.MaxInt32-digit)/10 {
if sign == 1 {
return math.MaxInt32
} else {
return math.MinInt32
}
}
result = result*10 + digit
i++
}
return result * sign
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41