PROBLEM

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

难度 中等

MY ANSWER

代码较为杂乱。

BETTER SOLUTION

处理前置空格与符号不和读取数字放在一个if-else里,处理溢出时注意INT_MIN为-2^32,而INT_MAX为2^32-1。

class Solution {
public:
int strToInt(string str) {
int res = 0;
int i = 0;
int flag = 1;
// 1. 检查空格
while (str[i] == ' ') {
i++;
}
// 2. 检查符号
if (str[i] == '-') {
flag = -1;
}
if (str[i] == '+' || str[i] == '-') {
i++;
}
// 3. 计算数字
while (i < str.size() && isdigit(str[i])) {
int r = str[i] - '0';
// ------ 4. 处理溢出,这是关键步骤 ------
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && r > 7)) {
return flag > 0 ? INT_MAX : INT_MIN;
}
// ------------------------------------
res = res * 10 + r;
i++;
}
return flag > 0 ? res : -res;
}
};

SUMMARY

字符串处理要注意特例与边界条件的处理。