题目描述:
https://leetcode.com/problems/string-to-integer-atoi/
解决方法:
int sign = 1, base = 0, i = 0;
while (str[i] == ' ') { i++; }
if (str[i] == '-' || str[i] == '+') {
sign = 1 - 2 * (str[i++] == '-');
}
while (str[i] >= '0' && str[i] <= '9') {
if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
if (sign == 1) return INT_MAX;
else return INT_MIN;
}
base = 10 * base + (str[i++] - '0');
}
return base * sign;
}
mycode(c++):
class Solution {
public:
int myAtoi(string str) {
int ret = 0;
int flag = 0;
int i = 0;
int j = str.length()-1;
while(i < str.length() && str.at(i)==' ')
i++;
while(j >=0 && (str.at(j)<'0' || str.at(j)>'9'))
j--;
if(i==str.length() || j== -1 )
return 0;
if(str.at(i)=='+'){
flag = 1;
i++;
}
else if( str.at(i)=='-'){
flag = -1;
i++;
}
else if (str.at(i) >= '0' && str.at(i) <= '9'){
flag = 1;
}
else{
return 0;
}
for(;i<=j;i++){
if(str.at(i) >= '0' && str.at(i) <= '9'){
if (flag ==1 && (ret > INT32_MAX/10 || (ret ==INT32_MAX/10 && str.at(i)-48 > 7))) return INT32_MAX;
if (flag ==-1 && (ret*flag < INT32_MIN/10 || (ret*flag ==INT32_MIN/10 && flag*(str.at(i)-48) < -8))) return INT32_MIN;
ret = ret * 10 + (str.at(i)-48);
}
else
return ret*flag;
}
return ret*flag;
}
};
心得:
1、不知道字符的asii表的时候,可以直接用相应的字符代码
比如得到'0'的ascii码,就用'0'-'0',str[i]-'0',就可以得到其数值。
2、得到正负号的时候,可以稍微用点儿技巧,节省判断
3、判断溢出的时候,因为正数负数极限值就差1,而且要求返回最大值,所以可以刚好只判断正书溢出即可
4、而且其实根本不需要处理后续的非数字字符,直接是从前往后处理,发现非数字字符时,就会退出。不需要从后往前处理,使用while循环