力扣65 有效数字 JS

该博客介绍了一种利用图解法来判断一个字符串是否符合有效数字的标准。通过构建一个图,每个节点代表字符串的一种状态,如正负号、小数点、数字等,并定义它们之间的转移条件。遍历字符串后,根据最终停留的节点判断是否为有效数字。这种方法能有效处理各种情况,简化了逻辑判断。

65. 有效数字 - 力扣(LeetCode)

利用图解决这种需要分很多情况讨论的题目。

构建一个图,每个结点表示一种情况,相邻结点之间是到达各种情况的条件,每个结点能达到的下一个结点必须是符合题意要求的情况,否则直接判定为无效数字。分清哪个到达哪个结点时是满足题意的。

如果最后遍历完给定字符串后结点数为满足题意的结点数,就是有效数字。

如果最后遍历完给定字符串后结点数为不满足题意的结点数,就是无效数字。

由题意构建出的图

 使用图的 邻接表 表示法把上述图结构书写出来(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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值