题目

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] != '\0')
{
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测试程序源码

LeetCode(65) Valid Number的更多相关文章

  1. LeetCode(137) Single Number II

    题目 Given an array of integers, every element appears three times except for one. Find that single on ...

  2. LeetCode(202) Happy Number

    题目 Write an algorithm to determine if a number is "happy". A happy number is a number defi ...

  3. LeetCode(36)Valid Sudoku

    题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  4. LeetCode(65):有效数字

    Hard! 题目描述: 验证给定的字符串是否为数字. 例如:"0" => true" 0.1 " => true"abc" =& ...

  5. LeetCode(306) Additive Number

    题目 Additive number is a string whose digits can form additive sequence. A valid additive sequence sh ...

  6. LeetCode(242)Valid Anagram

    题目 Given two strings s and t, write a function to determine if t is an anagram of s. For example, s ...

  7. LeetCode(49)-Valid Parentheses

    题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...

  8. LeetCode(125) Valid Palindrome

    题目 Given a string, determine if it is a palindrome, considering only alphanumeric characters and ign ...

  9. LeetCode(20)Valid Parentheses

    题目 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the i ...

随机推荐

  1. 怎么让普通用户达到root用户也可以拥有权限修改文件(CentOS系统)

    为什么会提出这个问题呢? 答:因为啊,比如我们在大数据集群搭建的时候,经常会需要配置环境变量,如/etc/profile.那么,问题来了,每次必须得都切换到root用户才能,但是呢,如何可以在普通用户 ...

  2. UvaLive6441(期望概率dp)

    1.涉及负数时同时维护最大和最小,互相转移. 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: db a = (C[i] - W[i]) * dp1[i - ][ ...

  3. 制作ubuntu启动U盘:Windows,Mac osx ,Ubuntu

    1.How to create a bootable USB stick on Windows https://www.ubuntu.com/download/desktop/create-a-usb ...

  4. iOS常用第三方库 -转

    转自 http://www.cnblogs.com/jukaiit/p/4956419.html 1.AFNetworking 轻量级的通讯类库,使用非常简单. 下载地址:https://github ...

  5. nginx中常见的变量

    $arg_PARAMETER        客户端GET请求PARAMETER的值. $args     请求中的参数. $binary_remote_addr 二进制码形式的客户端地址. $body ...

  6. servlet生命周期:

    Servlet生命周期分为三个阶段: 1,初始化阶段  servlet实例创建时调用init()方法,在Servlet的整个生命周期内,init()方法只被调用一次. 2,响应客户请求阶段 调用ser ...

  7. 探究SQL添加非聚集索引,性能提高几十倍之谜

    上周,技术支持反映:客户的一个查询操作需要耗时6.1min左右,在跟进代码后,简化了数据库的查询后仍然收效甚微.后来,技术总监分析了sql后,给其中的一个表添加的一个非聚集索引(三个字段)后,同样的查 ...

  8. 新建cordova应用,插件开发教程系列(总目录)

    以下几篇是连续的教程,代码也是连续的,包括如下章节: 新建cordova应用 https://www.cnblogs.com/cannel/p/11074359.html 使用cordova把h5应用 ...

  9. Unity3D 在自定义脚本中实现Button组件上的OnClick面板

    下述内容不对c#语法做过多讲解,仅对已入门并有兴趣的同学做为学习和拓展的资料 大家在Unity制作的过程中一定都使用过UI功能,那么很多人也一定见过这个面板: 那么我们如何能在自己的脚本中添加上像On ...

  10. SQL数据库移植到ARM板步骤

    SQL作为一种存储数据的数据结构,具有体积小(能堵存储的数据多),容易移植等优点.例如,在Ubuntu或者ARM开发板上被大量应用.下面就简单说一下SQL移植到ARM板的步骤. 下载源代码 (记得在家 ...