转载
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
状态迁移图:
class Solution:
def isNumber(self, s: str) -> bool:
# 有限状态机进行解答
# 由不同的触发,可以迁移到对应的状态
states = [
{' ':0, 's':1, 'd':2, '.':4}, # 状态0:起始的空格
{'d':2, '.':4}, # 状态1:空格后的正负号
{'d':2, '.':3, 'e':5, ' ':8}, # 状态2:正负号后的数字
{'d':3, 'e':5, ' ':8}, # 状态3:小数点前是数字,表示该小数点
{'d':3}, # 状态4:小数点前是空格时,表示该小数点
{'s':6, 'd':7}, # 状态5:幂符号,幂符号前可以是小数点么?
{'d':7}, # 状态6:幂符号后的正负号
{'d':7, ' ':8}, # 状态7:幂符号后的数字
{' ':8} # 状态8:结尾后的空格
]
# alias是部分符号的别名
alias = ''
# 当前所处的状态数字代号, 状态0是起始状态
state_num = 0
for item in s:
# + - 符号的别名为s
if item in ('+-'):
alias = 's'
# 空格 e . 符号的别名为本身
elif item in (' e.'):
alias = item
# 数字 0-9 符号的别名是 d
elif item >= '0' and item <= '9':
alias = 'd'
# 如果不是上面指定字符,则认为掺入了异常字符,直接返回False
else:
return False
# 如果该触发条件不是当前状态的触发条件,则直接返回False
if alias not in states[state_num]:
return False
# 将该触发条件发生后,状态迁移后的状态代号
state_num = states[state_num][alias]
# 2,3,7,8状态都可以认为是结束状态
return state_num in (2, 3, 7, 8)