剑指67:把字符串转换成整数

传送门

nowcoder
leetcode

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
数值为 0 或字符串不是一个合法的数值,则返回 0 。

数据范围:字符串长度满足 0 <= n <=100
要求:空间复杂度 O(1),时间复杂度 O(n)

C++ 代码 - nowcoder

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
/*
模拟
*/
class Solution {
public:
int StrToInt(string str) {
if (str.size() == 0) return 0;

// 去除空格
int k = 0;
while (k < str.size() && str[k] == ' ') k ++;
// 字符串转换为整数
long long num = 0;
bool isNegative = str[k] == '-';
for (int i = k; i < str.size(); i ++) {
char c = str[i];
if (i == k && (c == '+' || c == '-')) continue;
if (c < '0' || c > '9') return 0;
num = num * 10 + (c - '0');
}
if (isNegative) num *= -1;
if (num > INT_MIN && num <= INT_MAX) return num;
return 0;
}
};

C++ 代码 - leetcode

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
处理数字、符号、空格和 int 溢出的细节问题。
每一步的注释写清楚,不容易出错。
*/
class Solution {
public:
int myAtoi(string str) {
// res记录结果,flag记录符号
int n = str.size();
int res = 0, sign = 1, k = 0;
// 处理前置空格
while (str[k] == ' ') k ++;
// 处理符号
if (k < n && (str[k] == '-' || str[k] == '+')) {
sign = str[k] == '+' ? 1 : -1;
k ++;
}
// 处理数字
while (k < n && isdigit(str[k])) {
int digit = str[k] - '0'; //记录当前数字
// 判断当前结果是否溢出
if (res > (INT_MAX - digit) / 10) {
return sign == 1 ? INT_MAX : INT_MIN;
}
res = res * 10 + digit; // 累加当前数字
k ++;
}

return res * sign;
}
};

/*
思路同上
*/
class Solution {
public:
int myAtoi(string str) {
int n = str.size();
long res = 0; // 使用 long 避免 int 溢出
int sign = 1; // 记录正负号
int i = 0;

// 处理前置空格
while (i < n && str[i] == ' ') i ++;
if (i == n) return 0;

// 处理符号
if (str[i] == '-') {
sign = -1;
i ++;
} else if (str[i] == '+') {
i ++;
}
if (i == n) return 0;

// 处理数字
while (i < n && str[i] >= '0' && str[i] <= '9') {
res = res * 10 + str[i] - '0';
if (res > INT_MAX) break;
i ++;
}
// 溢出,强转成 int 就会和真实值不同
if ((int) res != res) {
return sign == 1 ? INT_MAX : INT_MIN;
}

return (int) res * sign;
}
};

剑指67:把字符串转换成整数
https://lcf163.github.io/2021/02/03/剑指67:把字符串转换成整数/
作者
乘风的小站
发布于
2021年2月3日
许可协议