实现案例:atoi
原理:LeetCode
表格表示:
Demo:
public int MyAtoi(string s)
{
#region 法2 状态机
Automaton auto = new Automaton();
foreach (var c in s)
{
if (auto.Process(c))
break;
}
return (int)(auto.current * auto.sign);
#endregion
}
class Automaton
{
public long current = 0;
public int sign = 1;
public string state = "start";
protected Dictionary<string, string[]> table = new Dictionary<string, string[]>()
{
{"start", new string[]{"start","sign","int","end" } },
{"sign", new string[]{"end","end","int","end" } },
{"int", new string[]{"end","end","int","end" } },
{"end", new string[]{"end","end","end","end" } },
};
public bool Process(char c)
{
state = table[state][ConvertIndex(c)];
if (state == "int")
if (current > int.MaxValue / 10 || (current == int.MaxValue / 10 && (c - '0') > int.MaxValue % 10))
{
current = sign > 0 ? int.MaxValue : (long)int.MaxValue + 1;
return true;
}
else
current = current * 10 + (c - '0');
else if (state == "sign" && c == '-')
sign = -1;
return state == "end";
}
private int ConvertIndex(char c)
{
int res = 2;
if(c > '9' || c < '0')
switch (c)
{
case ' ':
res = 0;
break;
case '-':
case '+':
res = 1;
break;
default:
res = 3;
break;
}
return res;
}
}