思路:状态机
1.分析题目要求可知,因为字符串的格式固定,(这样便暗示着状态是有限的,而且状态的先序关系可以确定)。
2.又因为字符处理的流程也是固定的,我们在读取一个字符s[i]的同时对其进行的操作流程是上一个读取的字符s[i-1]进行的,所以我们可以将处理字符s[i]流程的选择交由当前状态state[i]来确定。
3.不难求出,状态的迁移关系如图所示。
当前状态\当前字符s[i] | ’ ’ | ‘-’/’+’ | number | other |
---|---|---|---|---|
start | start | signed | number | end |
signed | end | end | in_number | end |
in_number | start | end | in_number | end |
end | end | end | end | end |
代码:
class myState
{
public:
string pstate;
int f;
int num;
unordered_map<string,vector<string>> nextState=
{
{"start",{"start","sighed","number","end"}},
{"sighed",{"end","end","number","end"}},
{"number",{"end","end","number","end"}},
{"end",{"end","end","end","end"}}
};
myState()
{
pstate="start";
f=1;
num=0;
}
void getNext(char c)
{
int next;
if(c==' ')
next=0;
else if(c=='-'||c=='+')
next=1;
else if(isdigit(c))
next=2;
else
next=3;
pstate=nextState[pstate][next];
if(pstate=="sighed"&&c=='-')
{
f=-1;
}
else if(pstate=="number")
{
int add=c-'0';
if((f==1&&num>INT_MAX/10)||(f==1&&num==INT_MAX/10&&add>7))
{
pstate="end";
num=INT_MAX;
}
else if((f==-1&&num==INT_MAX/10&&add>=8)||(f==-1&&num>INT_MAX/10))
{
num=INT_MIN;
pstate="end";
}
else
{
num=num*10+add;
}
}
}
};
class Solution {
public:
int myAtoi(string s) {
myState m;
for(int i=0;i<s.length();i++)
{
m.getNext(s[i]);
if(m.pstate=="end")
{
if(m.num==INT_MIN)
return m.num;
else
break;
}
}
if(m.num!=INT_MIN)
{
m.num=m.f*m.num;
}
return m.num;
}
};