题目
解题步骤
- 构建一个表示状态的图。
- 遍历字符串,并沿着图走,如果到了某个节点无路可走就返回false
- 遍历结束,如走到3/5/6,就返回true,否则返回false。
/**
* 时间复杂度: O(n)
* 空间复杂度: O(1)
* @param {string} s
* @return {boolean}
*/
var isNumber = function (s) {
// 构建一个图,用来描述这个字符可能所处的状态(邻接表)
// 只有 最后停在 3 5 6 三个状态,才表示为一个有效的数据
const graph = {
0: {
// 空格,还是表示在原地 空格直接就剔除了,内部出现空格则直接返回false
// 'blank': 0,
// 操作符 表示去到状态1 如 0+
'sign': 1,
// 后面跟小数点 表示去到状态2
'.': 2,
// 后面跟 0-9 的数字 可以去到状态6
'digit': 6
},
1: {
// 跟 数字 去到状态6
'digit': 6,
'.': 2
},
2: {
'digit': 3
},
3: {
'e': 4,
'digit': 3
},
4: {
'digit': 5,
'sign': 7
},
5: {
'digit': 5,
},
6: {
'digit': 6,
'.': 3,
'e': 4
},
7: {
'digit': 5
}
}
// 用变量记录当前的状态 开始状态为0
let state = 0;
// 开头和结尾有空格 也是有效的数字,所以我们先去除空格
s = s.trim();
// 遍历字符串,
for (str of s) {
// 将每个字符转为我们链接表构建的图识别的字符
if (str >= '0' && str <= '9') {
// js在比较时 会隐式的把字符串转为数字进行比较
str = 'digit';
} else if (str === '+' || str === '-') {
str = 'sign'
} else if (str === 'E') {
str = 'e'
}
// 更新当前字符串的状态
state = graph[state][str]
if (state === undefined) {
// 取不到字符c在图中的状态,也就是说没有该路可以走,,直接返回false
return false;
}
}
// 最后停在 3 5 6 三个状态,才表示为一个有效的数字
if (state === 3 || state === 5 || state === 6) return true
return false
};