题目很简单,我一开始的思路就是把有效数字装进字符串里,然后判断字符串和int_max 和int_min的大小然后在吧字符串转成int。
细节特别繁琐,后来看了别人的思路,瞬间觉得自己傻了很多。
class Solution {
public:
int myAtoi(string str) {
int i=0,j=0;
string res="";
int flag=-1;
while(str[i]==' '&&i<str.size()){i++;}
if(str[i]=='+')
flag=1,i++;
else if(str[i]=='-')
flag=0,i++;
if((str[i]-'0')>=0&&(str[i]-'0')<=9){
res+=str[i];
i++;
while(i<str.size()&&isdigit(str[i])){
res+=str[i];
i++;
}
}
else
return 0;
if((int)res.size()>0){
while(res[j]=='0'&&j<res.size()-1)
j++;
string a=res.substr(j);
cout<<a;
cout<<j;
if(flag==0){
a.insert(a.begin(),'-');
if(a.size()>11||(a.size()==11&&a>to_string (INT_MIN )))
return INT_MIN;
else
return atoi(a.c_str());
}
if(flag==1||flag==-1)
if(a.size()>10||(a.size()==10&&a>to_string (INT_MAX )))
return INT_MAX ;
else
return atoi(a.c_str());
}
return 0;
}
};
别人的代码是根据找的每一位计算当前的值然后比较上校两个边界,代码简洁了很多。
class Solution {
public:
int myAtoi(string str) {
if (str.empty()) return 0;
int sign = 1, base = 0, i = 0, n = str.size();
while (i < n && str[i] == ' ') ++i;
if (str[i] == '+' || str[i] == '-') {
sign = (str[i++] == '+') ? 1 : -1;
}
while (i < n && str[i] >= '0' && str[i] <= '9') {
if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
return (sign == 1) ? INT_MAX : INT_MIN;
}
base = 10 * base + (str[i++] - '0');
}
return base * sign;
}
};