使用DFA图(编译原理知识)
看到这种类型的题目,除了使用模拟算法,还是想着怎么使用到我们大学课程学过的知识。于是我们可以先画出DFA图,对着图形来写代码
class Solution {
public:
long long myAtoi(string s) {
bool flag=true;
long long ans=0;
int state=0;
for(int i=0;i<s.size();)
{
//1号状态
while(isdigit(s[i]) && i<s.size())
{
int x=s[i]-'0';
state=1;
if(flag && ans>(INT_MAX-x)/10) return INT_MAX;
if(!flag && -ans<(INT_MIN+x)/10) return INT_MIN;
ans=ans*10+s[i]-'0';
i++;
}
if(state==1 && !isdigit(s[i])) break; //跑到了2号状态
// 0号跑到了1号状态
else if(s[i]=='+' || s[i]=='-') {
state=1;
if(s[i]=='-') flag=false;
}
//0号状态终态
else if(state==0 && s[i]!=' ') return ans;
i++;
}
if(!flag) return -ans;
return ans;
}
};