题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
模式匹配
Python语言关于字符串是否是数值的判断(float(str)
),有如下规则:
- e和E大小写不敏感,e后面必须是任意整数,e前面必须有个任意整数或浮点数。如e2非法,1e2.6非法。
- 整型数的第一个数字位,如果不是各位,不能为0。如03非法,0合法。然而012e01合法,
- .1合法
然后查看官方教程,觉得要求不像python的float方法那么完善。具体的,
- 没有这一条要求:整型数的第一个数字位,如果不是个位,不能为0。如03非法,0合法。然而012e01合法,
- 没有考虑字符串中有空格的情形
这就简单很多了。表示数值的字符串遵循如下模式:
1 | [sign]integeral-digits[.[fractional-digits]][eE[sign]exponential-digits] |
那么,一路按上述模式进行匹配就行了。不在分析线上的,或者在分析线上就有问题的,就是不符合标准的。
1 | class Solution: |
有限状态机
有七个状态:
- state_0: 开始。
- state_1: 已有正负号。
- state_2: 已有数字。
- state_3:已有小数点。
- state_4:已有e
- state_5:已有e和正负号
- state_6: 已有e和[正负号]和数字
可以得到状态切换矩阵:
正负号 | 数字 | 小数点 | E | 结束 | |
---|---|---|---|---|---|
state_0 | 1 | 2 | 3 | F | F |
state_1 | F | 2 | 3 | F | F |
state_2 | F | 2 | 3 | 4 | T |
state_3 | F | 3 | F | 4 | T |
state_4 | 5 | 6 | F | F | F |
state_5 | F | 6 | F | F | F |
state_6 | F | 6 | F | F | T |
1 | class Solution: |