题目传送门
思路一:就简单的面向过程但是要处理好边界问题比较费劲
class Solution
{
public:
int myAtoi(string str)
{
int strLength=str.length();
int i;
for(i=0;i<strLength;i++)
{
if(str[i]==' ')
{
continue;
}
else
{
break;
}
}
if(str[i]=='+')
{
i++;
int temp=i;
while(int(str[i])>47&&int(str[i])<58)
{
i++;
}
string tempstr=str.substr(temp,i-temp);
int j=0;
while(tempstr[j]=='0')
{
j++;
}
tempstr=tempstr.substr(j);
if(tempstr.length()>10)
{
return INT_MAX;
}
if(tempstr.length()==0)
{
return 0;
}
if(stol(tempstr)>INT_MAX)
{
return INT_MAX;
}
else
{
return stol(tempstr);
}
}
else if(str[i]=='-')
{
i++;
int temp=i;
while(int(str[i])>47&&int(str[i])<58)
{
i++;
}
string tempstr=str.substr(temp,i-temp);
int j=0;
while(tempstr[j]=='0')
{
j++;
}
tempstr=tempstr.substr(j);
if(tempstr.length()>10)
{
return INT_MIN;
}
if(tempstr.length()==0)
{
return 0;
}
if(-1*stol(tempstr)<INT_MIN)
{
return INT_MIN;
}
else
{
return -1*stol(tempstr);
}
}
else if(int(str[i])>47&&int(str[i])<58)
{
int temp=i;
while(int(str[i])>47&&int(str[i])<58)
{
i++;
}
string tempstr=str.substr(temp,i-temp);
int j=0;
while(tempstr[j]=='0')
{
j++;
}
tempstr=tempstr.substr(j);
if(tempstr.length()==0)
{
return 0;
}
if(tempstr.length()>10)
{
return INT_MAX;
}
if(stol(tempstr)>INT_MAX)
{
return INT_MAX;
}
return stol(tempstr);
}
else
{
return 0;
}
}
};
思路二:有穷自动机
class Automation
{
public:
long ans=0;
int sign=1;
void getc(char ch)
{
int temp=whatChar(ch);
string curstate=m[state][temp];
state=curstate;
if(curstate=="sign")
{
if(ch=='-')
{
sign=-1;
}
}
if(curstate=="number")
{
ans=ans*10+ch-'0';
if(ans>INT_MAX&&sign==1)
{
ans=INT_MAX;
}
if(-1*ans<(INT_MIN)&&sign==-1)
{
ans=-1*(long)INT_MIN;
}
}
}
private:
string state="start";
unordered_map<string,vector<string> > m=
{
{"start",{"start","sign","number","end"}},
{"sign",{"end","end","number","end"}},
{"number",{"end","end","number","end"}},
{"end",{"end","end","end","end"}}
};
int whatChar(char ch)
{
if(ch==' ')
{
return 0;
}
else if(ch=='+'||ch=='-')
{
return 1;
}
else if(int(ch)>47&&int(ch)<58)
{
return 2;
}
else
{
return 3;
}
}
};
class Solution
{
public:
int myAtoi(string str)
{
Automation automation;
for(int i=0;i<str.length();i++)
{
automation.getc(str[i]);
}
return automation.sign*automation.ans;
}
};