原题描述
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
Input: " -1a12ac12 "
Output: -1
算法:注意特殊情况的处理
算法步骤如下:
1. 判断空字符串
2. 删除首尾空格
3. 判断删除之后是不是一个空字符串
4. 现将符号位$sign = 1$,再判断第一个位置是否是$+,-$,并将符号位置1或者0,i往后移动一位。
5. 开始转换int,使用long long类型的$ret$来循环转换,防止溢出,若碰到非法字符或者数值溢出,直接退出循环
6. 将转换的数乘上符号位$ret = ret * sign$,再判断上下界的溢出情况。
7. 返回$ret$
C++代码如下:
class Solution {
public:
// 字符串转int,注意判断超出Int范围
int myAtoi(string str) {
if (str == "") return 0;
// 去首尾空格
str.erase(0, str.find_first_not_of(' '));
str.erase(str.find_last_not_of(' ') + 1);
int i = 0, len = str.length(), sign = 1;
//while ( i < len && str[i] == ' ') i++;
if (i == len) return 0;
if (str[i] == '+') {
sign = 1;
i++;
} else if (str[i] == '-') {
sign = -1;
i++;
}
// 转换结果可能超出int范围,使用long long作为转换后接收变量的类型
long long ret = 0;
for (; i < len; i++) {
if (str[i] < '0' || str[i] > '9') break;
ret = ret * 10 + (str[i] - '0');
if (ret > INT_MAX) break;
}
ret *= sign;
if (ret > INT_MAX) return INT_MAX;
if (ret < INT_MIN) return INT_MIN;
return ret;
}
};
Bug Free Procedure 从记事本直接写代码
2016.12.01 语法错误
1. C++库里面字符串的函数str.erase(), find_first_not_of
2016.12.06 语法错误+逻辑错误
1. C++库里面字符串的函数str.erase(), find_first_not_of
2. for循环的时候i忘记自加了
2016.12.13 逻辑错误
1. str.find_last_not_of(‘ ‘)之后需要+1