剑指 Offer 67. 把字符串转换成整数
利用有限状态自动机解答
有限状态自动机(Finite State Machine, FSM)是一种数学模型,用于表示有限个状态以及在这些状态之间的转移和动作等。主要涉及的概念有:1. 状态(State):FSM 的当前条件或模式。比如就一个电灯,它的状态可以是「开」或「关」。2. 事件(Event):FSM 从一种状态过渡到另一种状态的输入。比如对电灯来说,事件可以是「开关被按下」。3. 转移(Transition):从一个状态到另一个状态的变化。转移会在某个事件发生时发生。比如电灯的转移可以是「当开关被按下时,从开状态转移到关状态」。4. 动作(Action):在转移过程中要执行的操作。比如对电灯来说,动作就是「关闭照明」或者「打开照明」。一个 FSM 可以用状态图来表示,一个圆表示一个状态,箭头表示转移,在箭头上标注相应的事件和动作。FSM 是一个很重要的概念,被应用在许多领域,如软件工程、电路设计、规划等等。UI、编译器、协议等都可以使用 FSM 来进行建模。总之,FSM 是表示一个有限数量的状态及在这些状态之间的转移和动作的一种很有用的抽象工具。
def strToInt(self, str: str) -> int:
maxx,minn=2**31-1,-2**31
status=[
{" ":0,"s":1,"n":2,"x":3},#0
{" ":3,"s":3,"n":2,"x":3},#1
{" ":3,"s":3,"n":2,"x":3},#2
{" ":3,"s":3,"n":3,"x":3}#3
]
fh,zt,res=1,0,0
for i in str:
if i==" ":t=i
elif i in "+-": t="s"
elif i.isdigit():t="n"
else :t="x"
zt=status[zt][t]
if zt==2:
res=10*res+int(i)
res = min(maxx,res) if fh == 1 else min(-minn,res)
elif zt == 1:
fh = 1 if i == '+' else -1
return fh * res
states 是一个列表,代表这个 FSM 的状态转移表。每个元素都是表示一种状态的转移规则。例如第一个元素 { ' ':0,'x':3,'s':1,'d':2} 表示:在状态0:- 如果输入是空格,则转移到状态0(保持不变)
- 如果输入是正负号,则转移到状态1
- 如果输入是数字,则转移到状态2
- 其他输入,则转移到状态3所以每个元素的键表示输入,值表示该输入下要转移的新状态。这个列表非常清晰地定义了这个 FSM 的所有状态转移逻辑。通过搜索列表就可以确定遇到任意输入应该如何转移状态。这种用列表表示状态转移的方法很常见,简洁明了,易于实现。我们只需要在遇到输入时,查找当前状态对应的转移规则,得到新状态,就可以进行状态迁移。所以,综上,states 代表的是这个 FSM 状态与输入之间的转移关系,是实现整个 FSM 的关键。