利用图解决这种需要分很多情况讨论的题目。
构建一个图,每个结点表示一种情况,相邻结点之间是到达各种情况的条件,每个结点能达到的下一个结点必须是符合题意要求的情况,否则直接判定为无效数字。分清哪个到达哪个结点时是满足题意的。
如果最后遍历完给定字符串后结点数为满足题意的结点数,就是有效数字。
如果最后遍历完给定字符串后结点数为不满足题意的结点数,就是无效数字。
由题意构建出的图
使用图的 邻接表 表示法把上述图结构书写出来(JS使用对象表示图)
遍历给定字符串,从结点0出发,如果该字符串满足到达下一个结点的条件,就可以得到下一个结点对应的结点数,最后判断停留到的结点数是否为有效数字满足的情况。
// blank 初始,sign 正负号, digit 数字
var isNumber = function (s) {
// 构建满足题意的图
const graph = {
0: { 'blank': 0, 'sign': 1, '.': 2, 'digit': 6 },
1: { 'digit': 6, '.': 2 },
2: { 'digit': 3 },
3: { 'digit': 3, 'e': 4, 'E': 4 },
4: { 'digit': 5, 'sign': 7 },
5: { 'digit': 5 },
6: { 'digit': 6, '.': 3, 'e': 4, 'E': 4 },
7: { 'digit': 5 }
}
// 图对应的结点数,初始为0
let state = 0;
for (c of s.trim()) {
if (c === ' ') {
c = 'blank';
} else if (c === '+' || c === '-') {
c = 'sign';
} else if (c >= '0' && c <= '9') {
c = 'digit';
}
// 如果该字符串满足该结点的邻接条件,则状态改变为条件该条件对应的数字
state = graph[state][c];
// 如果该字符串不满足该结点的邻接条件,证明不是有效数字
if (state === undefined) {
return false;
}
}
// 根据遍历完字符串后图的结点是否为有效数字对应的结点数
if (state == 3 || state == 5 || state == 6) {
return true;
} else {
return false;
}
};
该博客介绍了一种利用图解法来判断一个字符串是否符合有效数字的标准。通过构建一个图,每个节点代表字符串的一种状态,如正负号、小数点、数字等,并定义它们之间的转移条件。遍历字符串后,根据最终停留的节点判断是否为有效数字。这种方法能有效处理各种情况,简化了逻辑判断。
3351

被折叠的 条评论
为什么被折叠?



