题目描述
🔥 8. 字符串转换整数 (atoi)
思路分析
我们可以通过遍历字符串来实现这个功能。具体步骤如下:
- 跳过前导空格。
- 处理符号(如果存在)。
- 读取数字字符并构建整数值。
- 检查是否超出 32 位整数的范围。
参考代码
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
| func myAtoi(s string) int {
i := 0
n := len(s)
// 1. 跳过前导空格
for i < n && s[i] == ' ' {
i++
}
// 2. 处理符号
sign := 1
if i < n && (s[i] == '-' || s[i] == '+') {
if s[i] == '-' {
sign = -1
}
i++
}
// 3. 读取数字
res := 0
for i < n && s[i] >= '0' && s[i] <= '9' {
digit := int(s[i] - '0')
// 4. 检查是否超出范围
if res > (math.MaxInt32-digit)/10 {
if sign == 1 {
return math.MaxInt32
}
return math.MinInt32
}
res = res*10 + digit
i++
}
return res * sign
}
|
- 时间复杂度:O (n),其中 n 是字符串的长度。我们只遍历了一次字符串。
- 空间复杂度:O (1),只使用了常数级别的额外空间。
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
| func myAtoi(s string) int {
s = strings.TrimSpace(s)
if s == "" {
return 0
}
sign := 1
if s[0] == '-' {
sign = -1
s = s[1:]
} else if s[0] == '+' {
s = s[1:]
}
num := 0
for _, c := range s {
if c < '0' || c > '9' {
break
}
num = num*10 + int(c-'0')
if num*sign > math.MaxInt32 {
return math.MaxInt32
} else if num*sign < math.MinInt32 {
return math.MinInt32
}
}
return num * sign
}
|
🍏 点击查看 Java 题解
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
| class Solution {
public int myAtoi(String s) {
if (s == null || s.length() == 0) {
return 0;
}
s = s.trim();
int sign = 1;
long res = 0;
for (int i = 0; i < s.length(); i++) {
if (i == 0 && (s.charAt(i) == '-' || s.charAt(i) == '+')) {
if (s.charAt(i) == '-') {
sign = -1;
}
} else if (Character.isDigit(s.charAt(i))) {
res = res * 10 + (s.charAt(i) - '0');
if (sign * res > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if (sign * res < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
} else {
break;
}
}
return (int) (sign * res);
}
}
|
版权声明:
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!