http://blog.csdn.net/kenden23/article/details/18696083

本题是十分麻烦的题目,情况是非常多,网上也很多方法,其中最有效,优雅的方法是有限状态自动机(Finite automata machine)。其他一般方法都会十分复杂,而代码不能算优雅。为此我也曾经专门修了一个automata的知识。

只要设计好Finite Automata Machine之后,写程序就可以很优雅,很简单了。

但是,问题是要构造一个Finite Automata也是十分麻烦的事情,我画了一张A4纸,像蜘蛛网一样的,故此就不贴出来了,也搞了一两个小时,要多练练automata才能快起来吧

注释一下本题分多少状态吧:

0初始无输入或者只有space的状态
1输入了数字之后的状态
2前面无数字,只输入了Dot的状态
3输入了符号状态
4前面有数字和有dot的状态
5'e' or 'E'输入后的状态
6输入e之后输入Sign的状态
7输入e后输入数字的状态
8前面有有效数输入之后,输入space的状态

共9种状态了,难设计的是6,7,8状态。

分好之后就好办了,设计出根据输入进行状态转换就OK了。

这里的输入可以分:

INVALID,  // 0 Include: Alphas, '(', '&' ans so on
SPACE,  // 1
SIGN, // 2 '+','-'
DIGIT,  // 3 numbers
DOT, // 4 '.'
EXPONENT,  // 5 'e' 'E'

然后就是画蜘蛛网吧,什么状态可以转换到什么状态的。

下面代码也注释出来了,参照了Leetcode论坛上的代码写的:

 class Solution {
public:
bool isNumber(const char *s) {
enum InputType {
INVALID, // 0 Include: Alphas, '(', '&' ans so on
SPACE, //
SIGN, // 2 '+','-'
DIGIT, // 3 numbers
DOT, // 4 '.'
EXPONENT, // 5 'e' 'E'
};
int transTable[][] = {
//0INVA,1SPA,2SIG,3DI,4DO,5E
-, , , , , -,//0初始无输入或者只有space的状态
-, , -, , , ,//1输入了数字之后的状态
-, -, -, , -, -,//2前面无数字,只输入了Dot的状态
-, -, -, , , -,//3输入了符号状态
-, , -, , -, ,//4前面有数字和有dot的状态
-, -, , , -, -,//5'e' or 'E'输入后的状态
-, -, -, , -, -,//6输入e之后输入Sign的状态
-, , -, , -, -,//7输入e后输入数字的状态
-, , -, -, -, -,//8前面有有效数输入之后,输入space的状态
};
int state = ;
while (*s)
{
InputType input = INVALID;
if (*s == ' ') input = SPACE;
else if (*s == '+' || *s == '-') input = SIGN;
else if (isdigit(*s)) input = DIGIT;
else if (*s == '.') input = DOT;
else if (*s == 'e' || *s == 'E') input = EXPONENT;
state = transTable[state][input];
if (state == -) return false;
++s;
}
return state == || state == || state == || state == ;
}
};

leetcode-valid number ZZ的更多相关文章

  1. LeetCode: Valid Number 解题报告

    Valid NumberValidate if a given string is numeric. Some examples:"0" => true" 0.1 ...

  2. [LeetCode] Valid Number 验证数字

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  3. [leetcode]Valid Number @ Python

    原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...

  4. LeetCode——Valid Number

    Validate if a given string is numeric. Some examples: "0" => true " 0.1 " =&g ...

  5. Leetcode Valid Number

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  6. LeetCode Valid Number 有效数字(有限自动机)

    题意:判断一个字符串是否是一个合法的数字,包括正负浮点数和整形. 思路:有限自动机可以做,画个图再写程序就可以解决啦,只是实现起来代码的长短而已. 下面取巧来解决,分情况讨论: (1)整数 (2)浮点 ...

  7. leetcode - valid number 正则表达式解法

    import java.util.regex.Pattern; public class Solution { Pattern p = Pattern.compile("^[\\+\\-]? ...

  8. [LeetCode] Valid Number 确认是否为数值

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  9. 【LeetCode】65. Valid Number

    Difficulty: Hard  More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...

  10. 【leetcode】Valid Number

    Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...

随机推荐

  1. 前端cookie、localStorage、sessionStorage缓存技术总结

    转载自:https://www.cnblogs.com/belove8013/p/8134067.html 1.Cookie JavaScript是运行在客户端的脚本,因此一般是不能够设置Sessio ...

  2. jacvascript 保留小数点

    //四舍五入保留2位小数(若第二位小数为0,则保留一位小数) function keepTwoDecimal(num) {  var result = parseFloat(num);  if (is ...

  3. c#静态扩展方法,字典的克隆扩展方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 2-3 树/红黑树(red-black tree)

    2-3 tree 2-3树节点: null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大 3叉节点,有三个子树 ...

  5. 配置文件详解和核心api讲解

    一.配置文件详解 1.映射文件详解 1.映射配置文件的位置和名称没有限制. -建议:位置:和实体类放在统一目录下.  名称:实体类名称.hbm.xml.    2.在映射配置文件中,标签内的name属 ...

  6. mysql-elastic search canal

    背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝 ...

  7. AngularJS的日期格式化去掉秒

    <td>订单创建时间:{{item.odatetime.substring(0,16)}}</td>

  8. 创建一个自定义的Application类

    由于每个应用程序必须创建一个Application对象,vs为开发人员提供了模板来减轻开发人员的重复工作.当使用vs创建一个WPF应用程序是,vs会自动创建一个app.xaml文件, <Appl ...

  9. JS大写转小写小写转大写,JS字符串大小写互换

    Array.prototype.map.call(str,a=>a.toUpperCase(a)==a?a.toLowerCase():a.toUpperCase()).join(''); 效果 ...

  10. Oracle数据库查看已添加的索引和创建索引

    /** *查看目标表中已添加的索引 * */ --在数据库中查找表名 select * from user_tables where table_name like 'tablename%'; --查 ...