字符串转换整数 (atoi)
自动状态机解法。
像题目要求的这种可以根据输入明确画出状态变化的情况可以考虑建立一个自动状态机。
class Automation{
private:
string state="start";
unordered_map<string,vector<string>> table={
{"start",{"start","signed","in_number","end"}},
{"signed",{"end","end","in_number","end"}},
{"in_number",{"end","end","in_number","end"}},
{"end",{"end","end","end","end"}},
};
int get_col(char c)
{
if(isspace(c))
return 0;
else if(c=='+'||c=='-')
return 1;
else if(isdigit(c))
return 2;
return 3;
}
public:
int sign=1;
long long ans=0;
void get(char c)
{
state=table[state][get_col(c)];
if(state=="signed")
{
if(c=='-')
sign=-1;
}
else if(state=="in_number")
{
ans=ans*10+c-'0';
ans=sign==1?min(ans,(long long)INT_MAX):min(ans,-(long long)INT_MIN);
}
}
};
class Solution {
public:
int myAtoi(string str) {
Automation A;
for(auto ch:str)
A.get(ch);
return A.sign*A.ans;
}
};
另外用到了ctype.h中的两个函数:
_Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int __cdecl isspace(_In_ int _C);
_Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int __cdecl isdigit(_In_ int _C);
本文记录了LeetCode中的字符串转换整数问题的解决方案,采用自动状态机的方法,并介绍了如何利用ctype.h库中的函数来实现。
371

被折叠的 条评论
为什么被折叠?



