LEETCODE专题
8. String to Integer (atoi)
题目要求:
这里其实就是将atoi函数自己实现一遍。
这道题同学在完成的时候用了stringstream,用的代码规模很小,基本上就是几个读写和判断就搞定了。然而时间稍微有点长。。。花了将近32ms的时间。我在完成这道题的时候全程没有用到stringstream,坚持用string的数组操作来一个字符一个字符的检查,这样虽然代码规模比较大,写起来判断也稍微多了点,但是效率高了很多,只花了10ms。
- 这里就简单说一下用到的几个判断:
- 对输入字符的判断:是否是符号’+’、’-‘,是否是字母(其实后来想想应该是没有必要的,可以删去),是否是数字
- 对输出数字溢出的判断:正数是否大于最大正数,负数是否小于最小负数(因为最大的正数和最小的负数绝对值不一样,所以我选择分开比较)
接下来直接上code:
class Solution {
public:
bool isDigit(char a) {
return a >= '0' && a <= '9';
}
bool isLetter(char a) {
return (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z');
}
bool isSign(char a) {
return a == '+' || a == '-';
}
bool isValid(char a) {
return isDigit(a) || isLetter(a) || isSign(a);
}
int myAtoi(string str) {
// get the index of the first char except ' '
int index = 0;
string result;
while (index < str.length() && str[index] == ' ') index++;
if (index == str.length() ) return 0;
while (index < str.length() && isValid(str[index]) ) {
if (isLetter(str[index]) ) {
break;
} else if (isSign(str[index]) ) {
if (result.size() > 0) {
break;
} else {
if (isSign(result[result.length() - 1]) ) {
return 0;
} else {
result += str[index++];
}
}
} else {
result += str[index++];
}
}
if (result.length() == 0) return 0;
/* if the sum is out of range,
* set it to be INT_MAX OR INT_MIN
*/
int sum = 0;
if (isSign(result[0])) {
index = 1;
} else {
index = 0;
}
while (index < result.length() ) {
if (result[0] != '-') {
if (sum > (INT_MAX - (result[index] - '0') ) / 10) {
return INT_MAX;
} else {
sum = sum * 10 + (result[index++] - '0');
}
} else if (result[0] == '-') {
if (sum < (INT_MIN + (result[index] - '0') ) / 10) {
return INT_MIN;
} else {
sum = sum * 10 - (result[index++] - '0');
}
}
}
return sum;
}
};
时间复杂度:O(n)