有效数字(按顺序)可以分成以下几个部分:

    一个 小数 或者 整数
    (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
    小数(按顺序)可以分成以下几个部分:

    (可选)一个符号字符(’+’ 或 ‘-‘)
    下述格式之一:
    至少一位数字,后面跟着一个点 ‘.’
    至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    一个点 ‘.’ ,后面跟着至少一位数字
    整数(按顺序)可以分成以下几个部分:

    (可选)一个符号字符(’+’ 或 ‘-‘)
    至少一位数字
    部分有效数字列举如下:

    [“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”]
    部分无效数字列举如下:

    [“abc”, “1a”, “1e”, “e3”, “99e2.5”, “—6”, “-+3”, “95a54e53”]
    给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

    0683d701f2948a2bd8c235867c21a3aed5977691f129ecf34d681d43d57e339c-DFA.jpg
    1.png
    完整的有效数字
    +3.3e+3
    有限状态机,找出初始状态和接受拒绝状态,写出邻接表

    1. var isNumber = function(s) {
    2. const graph = {
    3. 0:{"blank":0,'sign':1,".":2,"digit":6},
    4. 1:{"digit":6,".":2},
    5. 2:{"digit":3},
    6. 3:{"digit":3,"e":4},
    7. 4:{"digit":5,"sign":7},
    8. 5:{"digit":5},
    9. 6:{"digit":6,".":3,"e":4},
    10. 7:{"digit":5}
    11. }
    12. let state = 0
    13. for(c of s.trim()){
    14. if(c<10 && c>=0){
    15. c = 'digit'
    16. }else if(c === ' '){
    17. c = 'blank'
    18. }else if(c ==='+' || c==="-"){
    19. c = 'sign'
    20. }else if (c==='e' || c==='E'){
    21. c = 'e'
    22. }
    23. state = graph[state][c]
    24. if(state === undefined) {
    25. return false
    26. }
    27. }
    28. if(state == 3|| state == 5|| state == 6){
    29. return true
    30. }
    31. return false
    32. };