【leetcode】Valid Number

原创 2015年11月19日 23:28:50

目前leetcode上AC率最低的一题。第一次实战有限状态机,终于摸到点皮毛了。


输入存在6种情况:

  • 0 无效值 INVALID
  • 1 空白符 SPACE
  • 2 正负号 SIGN
  • 3 小数点 DOT
  • 4 数字 NUMBER
  • 5 指数符 EXPONENT

通过在Custom Testcase输入测试用例,可以看出合法的格式,不一一列出。

状态跳转情况(英文表示该状态可以接受的输入,紧跟的数字表示将会跳转至哪个状态):

  • 状态0:SPACE 0, SIGN 1, DOT 2, NUMBER 3
  • 状态1:DOT 2, NUMBER 3
  • 状态2:NUMBER 4
  • 状态3(合法结束):DOT 4, NUMBER 3, EXPONENT 5, SPACE 8
  • 状态4(合法结束):EXPONENT 5, NUMBER 4, SPACE 8
  • 状态5:SIGN 6, NUMBER 7
  • 状态6:NUMBER 7
  • 状态7(合法结束):NUMBER 7, SPACE 8
  • 状态8(合法结束):SPACE 8

代码使用到状态转移表,行号代表状态,列号代表当前输入情况,元素数值代表即将跳转至的状态。


bool isNumber(char* s) {
    enum InputType
    {
        INVALID,
        SPACE,
        SIGN,
        DOT,
        NUMBER,
        EXPONENT,
        NUM_STATE,
    };
    
    int transTable[][NUM_STATE] = 
    {
        -1,  0,  1,  2,  3, -1,
        -1, -1, -1,  2,  3, -1,
        -1, -1, -1, -1,  4, -1,
        -1,  8, -1,  4,  3,  5,
        -1,  8, -1, -1,  4,  5,
        -1, -1,  6, -1,  7, -1,
        -1, -1, -1, -1,  7, -1,
        -1,  8, -1, -1,  7, -1,
        -1,  8, -1, -1, -1, -1
    };
    
    int state = 0;
    int inputType = 0;
    while (*s != '\0')
    {
        if (isspace(*s))
            inputType = SPACE;
        else if (*s == '+' || *s == '-')
            inputType = SIGN;
        else if (*s == '.')
            inputType = DOT;
        else if (isdigit(*s))
            inputType = NUMBER;
        else if (*s == 'E' || *s == 'e')
            inputType = EXPONENT;
        else
            inputType = INVALID;
        state = transTable[state][inputType];
        if (state == -1)
            return false;
        ++s;
    }
    return state == 3 || state == 4 || state == 7 || state == 8;
}


Reference:https://github.com/fuwutu/LeetCode/blob/master/Valid%20Number.cpp

版权声明:本文为博主原创文章,未经博主允许不得转载。

Valid Number -- LeetCode

原题链接: http://oj.leetcode.com/problems/valid-number/  这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几...
  • linhuanmars
  • linhuanmars
  • 2014年04月16日 04:04
  • 9973

[LeetCode]611. Valid Triangle Number

https://leetcode.com/problems/valid-triangle-number/#/description 找出满足组成三角形的三条边的个数 组成三角形条件是两...
  • gqk289
  • gqk289
  • 2017年06月17日 21:18
  • 776

Leetcode 65. Valid Number 验证数字 解题报告

1 解题思想这道题条条框框是在太多了,各种情况。。不过简略来说,正确的做法应该是: 1、熟悉数字的表述规则(可以看网上的,也可以看我代码的),这道题关键是要懂所有的数字规则。 2、对输入的数字首先...
  • MebiuW
  • MebiuW
  • 2016年05月08日 23:44
  • 3804

65. Valid Number-leetcode-java

【原来在SAE的blog上,都转到CSDN了。。】 65. Valid Number-leetcode-java 发表于 2016/02/10 题目: Va...
  • hahawhyha
  • hahawhyha
  • 2016年05月06日 18:44
  • 1062

leetcode611: Valid Triangle Number

Given an array consists of non-negative integers, your task is to count the number of triplets chose...
  • sinat_35425429
  • sinat_35425429
  • 2017年06月15日 20:28
  • 411

LeetCode(65) Valid Number

题目Validate if a given string is numeric.Some examples: “0” => true ” 0.1 ” => true “abc” => false...
  • fly_yr
  • fly_yr
  • 2015年09月14日 19:51
  • 1581

[LeetCode]65.Valid Number

Validate if a given string is numeric.Some examples: “0” => true ” 0.1 ” => true “abc” => false ...
  • SunnyYoona
  • SunnyYoona
  • 2015年06月16日 16:25
  • 1832

leetcode_c++:Valid Number(065)

Validate if a given string is numeric.Some examples: “0” => true ” 0.1 ” => true “abc” => false ...
  • mijian1207mijian
  • mijian1207mijian
  • 2016年08月06日 17:53
  • 102

leetcode 65:Valid Number 使用字符串匹配的细致分析

Validate if a given string is numeric. Some examples: "0" => true " 0.1 " => true "abc" => fal...
  • tingting256
  • tingting256
  • 2015年11月04日 22:19
  • 583

【LeetCode】Valid Number 解题报告

【题目】 Validate if a given string is numeric. Some examples: "0" => true " 0.1 " => true "a...
  • ljiabin
  • ljiabin
  • 2015年04月10日 15:29
  • 1477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【leetcode】Valid Number
举报原因:
原因补充:

(最多只允许输入30个字)