判断字符串是否表示数值
大约 2 分钟
判断字符串是否表示数值
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = " .1 "
输出:true
此题可以使用有限状态自动机来解,列好一个状态表, 如在第一个字符中有符合的状态,则转入到下一个可能的状态规则中。 如第一个字符只可能是空白,正负号,数字,或小数点
def isNumber(s):
'''列好所有状态
整数
小数
科学计数
'''
states = [
{ ' ': 0, 's': 1, 'd': 2, '.': 4 }, # 0. 开头可能的四种状态
{ 'd': 2, '.': 4 } , # 1. 正负号后2种的状态
{ 'd': 2, '.': 3, 'e': 5, ' ': 8 }, # 2. 数字后的状态,如果是整数,则状态停留在2
{ 'd': 3, 'e': 5, ' ': 8 }, # 3. 小数点后的状态
{ 'd': 3 }, # 4. 小数点后跟数字的状态
{ 's': 6, 'd': 7 }, # 5. 'e'后,如 1.03E+08
{ 'd': 7 }, # 6. e跟上数字之后
{ 'd': 7, ' ': 8 }, # 7. e跟上数字之后,结尾状态
{ ' ': 8 } # 8. 以空白结尾
]
p=0
for i in s:
if '0'<=i<='9':t='d'
elif i in '+-':t='s'
elif i in 'eE':t='e'
elif i in '. ':t=i
else: t='?'
if t not in states[p]:return False
p = states[p][t]
return p in [2,3,7,8]
print(isNumber('1.03E+08'))
这些状态分类看上似很复杂,其实按 整数小数科学计数 三大类型一一跟踪补齐状态就可以解决。