8. String to Integer (atoi)
做题历程:
- 2016/Oct/19,本题做了不止2次,本次大概耗时20分钟,独立解出
本题难倒是不难,就是很坑爹,需要处理的corner case太多了,几乎不可能一次考虑全,大致总结下需要考虑的corner case吧:
+,-号,这个是最基础的- 诡异字符,直接跳出
- 过大/过小的数: 在
* 10之前要判断跟INT_MAX / 10的大小关系
代码如下:
class Solution {
public:
int myAtoi(string str) {
int i = 0;
bool positive = true;
while (i < str.length()) {
if (str[i] == ' ') {
++i;
continue;
}
if (str[i] == '-') {
positive = false;
++i;
break;
}
else if (str[i] == '+') {
++i;
break;
}
if (isdigit(str[i])) {
break;
}
else {
return 0;
}
++i;
}
int num = 0;
while (i < str.length()) {
if (isdigit(str[i])) {
if (num == INT_MAX / 10) {
if (positive && str[i] > '7') {
return INT_MAX;
}
else if (!positive && str[i] > '8') {
return INT_MIN;
}
}
else if (num > INT_MAX / 10) {
return positive ? INT_MAX : INT_MIN;
}
num = num * 10 + (str[i] - '0');
++i;
}
else {
break;
}
}
return positive ? num : -num;
}
};