请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个 '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
提示:
1 <= s.length <= 20
-
s
仅含英文字母(大写和小写),数字(0-9
),加号'+'
,减号'-'
,空格' '
或者点'.'
。
解题思路:有限自动状态机
- 根据字符串明确几种可能的状态;
- 明确字符串的组成成分;
- 定义转换过程;
- 反复思考,完善可能发生的情况。
package main
const (
StateInit = iota
StateSign
StateInt
StatePoint
StatePointWithoutInt
StateFraction
StateExp
StateExpSign
StateExpInt
StateEnd
)
const (
CharSpace = iota
CharSign
CharNum
CharExp
CharPoint
CharEnd
)
var CharType = map[string]int{
"0": CharNum,
"1": CharNum,
"2": CharNum,
"3": CharNum,
"4": CharNum,
"5": CharNum,
"6": CharNum,
"7": CharNum,
"8": CharNum,
"9": CharNum,
" ": CharSpace,
"-": CharSign,
"+": CharSign,
"e": CharExp,
"E": CharExp,
".": CharPoint,
}
var StateChar = map[int]map[int]int{
StateInit: {
CharSpace: StateInit,
CharSign: StateSign,
CharNum: StateInt,
CharPoint: StatePointWithoutInt,
},
StateSign: {
CharNum: StateInt,
CharPoint: StatePointWithoutInt,
},
StateInt: {
CharSpace: StateEnd,
CharNum: StateInt,
CharExp: StateExp,
CharPoint: StatePoint,
CharEnd: StateEnd,
},
StatePoint: {
CharSpace: StateEnd,
CharNum: StateFraction,
CharExp: StateExp,
CharEnd: StateEnd,
},
StatePointWithoutInt: {
CharNum: StateFraction,
},
StateFraction: {
CharSpace: StateEnd,
CharNum: StateFraction,
CharExp: StateExp,
CharEnd: StateEnd,
},
StateExp: {
CharSign: StateExpSign,
CharNum: StateExpInt,
},
StateExpSign: {
CharNum: StateExpInt,
},
StateExpInt: {
CharSpace: StateEnd,
CharNum: StateExpInt,
CharEnd: StateEnd,
},
StateEnd: {
CharSpace: StateEnd,
CharEnd: StateEnd,
},
}
func isNumber(s string) bool {
stat := StateInit
var ok bool
var tmpStat int
for i := 0; i < len(s); i++ {
cur := string(s[i])
charType := CharType[cur]
if _, ok = CharType[cur]; !ok {
return false
}
if tmpStat, ok = StateChar[stat][charType]; ok {
stat = tmpStat
} else {
return false
}
}
if _, ok = StateChar[stat][CharEnd]; ok {
return true
}
return false
}
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
网友评论