zoukankan      html  css  js  c++  java
  • LeetCode(65) Valid Number

    题目

    Validate if a given string is numeric.

    Some examples:
    “0” => true
    ” 0.1 ” => true
    “abc” => false
    “1 a” => false
    “2e10” => true
    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

    Update (2015-02-10):
    The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.

    分析

    参考博客

    这道题的判定种类很多,没有想出好的解决方法,AC是参考上面博客的,分析很透彻,谢谢博主!

    将其分析复制如下,方便查阅:

    用有限状态机,非常简洁,不需要复杂的各种判断!

    先枚举一下各种合法的输入情况:

    1.空格+ 数字 +空格

    2.空格+ 点 + 数字 +空格

    3.空格+ 符号 + 数字 + 空格

    4.空格 + 符号 + 点 + 数字 +空格

    5.空格 + (1, 2, 3, 4) + e + (1, 2, 3, 4) +空格

    组后合法的字符可以是:

    1.数字

    2.空格

    有限状态机的状态转移过程:

    起始为0:

      当输入空格时,状态仍为0,

      输入为符号时,状态转为3,3的转换和0是一样的,除了不能再接受符号,故在0的状态的基础上,把接受符号置为-1;

      当输入为数字时,状态转为1, 状态1的转换在于无法再接受符号,可以接受空格,数字,点,指数;状态1为合法的结束状态;

      当输入为点时,状态转为2,状态2必须再接受数字,接受其他均为非法;

      当输入为指数时,非法;

    状态1:

      接受数字时仍转为状态1,

      接受点时,转为状态4,可以接受空格,数字,指数,状态4为合法的结束状态,

      接受指数时,转为状态5,可以接受符号,数字,不能再接受点,因为指数必须为整数,而且必须再接受数字;

    状态2:

      接受数字转为状态4;

    状态3:

      和0一样,只是不能接受符号;

    状态4:

      接受空格,合法接受;

      接受数字,仍为状态4;

      接受指数,转为状态5,

    状态5:

      接受符号,转为状态6,状态6和状态5一样,只是不能再接受符号,

      接受数字,转为状态7,状态7只能接受空格或数字;状态7为合法的结束状态;

    状态6:

      只能接受数字,转为状态7;

    状态7:

      接受空格,转为状态8,状态7为合法的结束状态;

      接受数字,仍为状态7;

    状态8:

      接受空格,转为状态8,状态8为合法的结束状态;

    AC代码

    class Solution {
    public:
        bool isNumber(string s) {
            //输入参数枚举
            enum InputType{
                INVALID, //代表不正确
                SPACE, // 代表空格
                SIGN, // 代表符号
                DIGIT,
                DOT, //代表点符号
                EXPONENT, //代表科学计算
                NUM_INPUTS //数字输入
            };
    
            int transitionTable[][NUM_INPUTS] =
            {
                -1, 0, 3, 1, 2, -1,     // next states for state 0
                -1, 8, -1, 1, 4, 5,     // next states for state 1
                -1, -1, -1, 4, -1, -1,     // next states for state 2
                -1, -1, -1, 1, 2, -1,     // next states for state 3
                -1, 8, -1, 4, -1, 5,     // next states for state 4
                -1, -1, 6, 7, -1, -1,     // next states for state 5
                -1, -1, -1, 7, -1, -1,     // next states for state 6
                -1, 8, -1, 7, -1, -1,     // next states for state 7
                -1, 8, -1, -1, -1, -1,     // next states for state 8
            };
    
    
            int state = 0, i = 0;
            while (s[i] != '')
            {
                InputType inputType = INVALID;
                if (isspace(s[i]))
                    inputType = SPACE;
                else if (s[i] == '+' || s[i] == '-')
                    inputType = SIGN;
                else if (isdigit(s[i]))
                    inputType = DIGIT;
                else if (s[i] == '.')
                    inputType = DOT;
                else if (s[i] == 'e' || s[i] == 'E')
                    inputType = EXPONENT;
    
                state = transitionTable[state][inputType];
    
                if (state == -1)
                    return false;
                else
                    i++;
            }
    
            return state == 1 || state == 4 || state == 7 || state == 8;
    
        }
    };
    

    GitHub测试程序源码

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214863.html
Copyright © 2011-2022 走看看