题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
- 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(’+’ 或 ‘-’)
- 下述格式之一:
- 至少一位数字,后面跟着一个点 ‘.’
- 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
- 一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(’+’ 或 ‘-’)
- 至少一位数字
部分数值列举如下:
["+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
Leetcode链接:剑指offer面试题20:表示数值的字符串
算法分析
本题采用有限状态自动机,每次状态转移只输出true或者false,判断当前状态是接受状态(以该状态结尾是合法的)还是拒绝状态(与接受状态相反)。
-
确定状态
- 起始的空格
- 符号位
- 整数部分
- 左侧有整数的小数点
- 左侧无整数的小数点
- 小数部分
- 幂符号 e \text{e} e 或 E \text{E} E
- 指数符号位
- 指数阶数
- 末尾的空格
易知,接受状态为2、3、5、8、9,剩下的状态为拒绝状态
-
状态转移规则
- 当 c 为空格时,执行 t = ’ ’
- 当 c 为正负号时,执行 t = ‘s’ ;
- 当 c 为数字时,执行 t = ‘d’ ;
- 当 c 为 e \text{e} e,