题目链接:力扣
这题并不复杂,但是根据不同类型的输入会进行不同的操作,因此关键是有限状态自动机的应用。如果直接枚举出所有的情况,代码会非常复杂。此外这题还需要考虑溢出的边界情况。
本题的自动机如下:
// ' ' '+/-' 0~9 others
// start start signed in_number end
// signed end end in_number end
// in_number end end in_number end
// end end end end end
代码如下,其实想到自动机以后代码就非常简单:
class Solution {
public:
int myAtoi(string s) {
unordered_map<string,vector<string>> state={
{"start",{"start","signed","in_number","end"}},
{"signed",{"end","end","in_number","end"}},
{"in_number",{"end","end","in_number","end"}},
{"end",{"end","end","end","end"}}
};
string st="start";
long long res=0;
bool is_negative=false;
for(int i=0;i<s.size();i++){
if(st=="end"){
break;
}
char c=s[i];
if(c==' '){
st=state[st][0];
}
else if (c=='+' || c=='-'){
st=state[st][1];
if(st=="end") break;
if(c=='-') is_negative=true;
}else if (c>='0'&& c<='9'){
st=state[st][2];
res=res*10+c-'0';
if(!is_negative && res>INT_MAX) return INT_MAX;
else if(is_negative && -res<INT_MIN) return INT_MIN;
}else{
st=state[st][3];
}
}
if(is_negative){
res=-res;
return (int)res;
}
return (int)res;
}
};