前言
Valid Number 要求判断一个由字母、数字、正负号、小数点组成的字符串是不是一个合法的数字,合法的数字就是:
- (+/-)整数或小数
- (+/-)整数或小数 + E或e + (+/-)整数
两种格式,例如:'1E3'、'-2e+5';不能这样子:'+E1'、'e'、'2E'、'+-1'。
整数所有字符都是数字,小数有 3 种格式:
- 数字 + . + 数字
- 数字 + .
- . + 数字
也就是说,这些都是正确的数字:'0000'、'.0001'、'+114.E-514';这样子就不行:'.'、'+.'、'1.1.1'、'miao'。
这个问题解法很明显,使用有限状态机,输入有:数字、符号、小数点、e、其他、结束,一共 6 种。状态可以根据字符串字符在 e 的前面还是后面,是整数还是小数设置,合法的状态转移如下所示:
时间复杂度 , 是字符串长度,空间复杂度 。
Code
ts- const state = {
- PRE_SIGN: 0,
- PRE_INT: 1,
- PRE_POINT: 2,
- PRE_DEC: 3,
- E: 4,
- POST_SIGN: 5,
- POST_INT: 6,
- ERROR: 7,
- SUCCESS: 8,
- DEFAULT: 9,
- PRE_FIRST_POINT: 10
- }
- const input = {
- E: 0,
- NUM: 1,
- POINT: 2,
- SIGN: 3,
- ELSE: 4,
- END: 5
- }
- const transfer = [
- [state.ERROR, state.PRE_INT, state.PRE_FIRST_POINT, state.ERROR, state.ERROR, state.ERROR],
- [state.E, state.PRE_INT, state.PRE_POINT, state.ERROR, state.ERROR, state.SUCCESS],
- [state.E, state.PRE_DEC, state.ERROR, state.ERROR, state.ERROR, state.SUCCESS],
- [state.E, state.PRE_DEC, state.ERROR, state.ERROR, state.ERROR, state.SUCCESS],
- [state.ERROR, state.POST_INT, state.ERROR, state.POST_SIGN, state.ERROR, state.ERROR],
- [state.ERROR, state.POST_INT, state.ERROR, state.ERROR, state.ERROR, state.ERROR],
- [state.ERROR, state.POST_INT, state.ERROR, state.ERROR, state.ERROR, state.SUCCESS],
- undefined,
- undefined,
- [state.ERROR, state.PRE_INT, state.PRE_FIRST_POINT, state.PRE_SIGN, state.ERROR, state.ERROR],
- [state.ERROR, state.PRE_DEC, state.ERROR, state.ERROR, state.ERROR, state.ERROR]
- ]
- function isNumber(s: string): boolean {
- let currentState = state.DEFAULT
- const len = s.length
- for (let i = 0; i <= len; i++) {
- let inputType: number
- if (s[i] === 'e' || s[i] === 'E') {
- inputType = input.E
- } else if (s[i] >= '0' && s[i] <= '9') {
- inputType = input.NUM
- } else if (s[i] === '.') {
- inputType = input.POINT
- } else if (s[i] == '+' || s[i] === '-') {
- inputType = input.SIGN
- } else if (s[i] === undefined) {
- inputType = input.END
- } else {
- inputType = input.ELSE
- }
- currentState = transfer[currentState][inputType] as number
- if (currentState === state.ERROR || currentState === state.SUCCESS) {
- break
- }
- }
- return currentState === state.SUCCESS
- };
0 条评论未登录用户
Ctrl or + Enter 评论
