题目:

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.

链接: http://leetcode.com/problems/valid-number/

题解:

看到这种题目第一反应就是DFA了,不过怎么构建好的DFA真的很难。参考了leetcode讨论版。 Automata的知识还要好好学习学习,希望年底前还有时间。

首先对字符串进行trim,去除前后的space。之后构建DFA。输入有五种情况

  • 0 - 9
  • +, -
  • e
  • dot
  • other

其中dot有种特殊情况, 就是  1.成立,但 .不成立,所以对有没有数字使用一个boolean变量来记录。 应该还可以再简化,要再研究研究。

Time Complexity - O(n), Space Complexity - O(1)。

public class Solution {
public boolean isNumber(String s) {
if(s == null || s.length() == 0)
return false;
s = s.trim();
int state = 0;
boolean hasNum = false; for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
hasNum = true;
if(state <= 2)
state = 2;
else
state = (state <= 5) ? 5 : 7;
} else if(s.charAt(i) == '+' || s.charAt(i) == '-') {
if(state == 0 || state == 3)
state++;
else
return false;
} else if (s.charAt(i) == '.') {
if(state <= 2)
state = 6;
else
return false;
} else if (s.charAt(i) == 'e') {
if(state == 2 || (hasNum && state == 6) || state == 7)
state = 3;
else
return false;
} else
return false;
} return (state == 2 || state == 5 || (hasNum && state == 6) || state == 7);
}
}

Test cases:

通过以下的例子我们可以看出,对dot我们需要额外判断,比如

"+.5e-5"  -  True

"+5."    - True

"5e-10.6"  - False  使用科学计数法以后不可以出现 dot

".5e10"  - True

".e10" - False

"." - False

"+5.e10" - True

二刷:

还是用state machine,画图的方法。我们详细地分解一下每个步骤。

  1. 首先还是上面的图, 我们先对s进行trim操作,去除头尾的空格space
  2. 设置一个变量hasNum来判断在string中是否曾经出现过数字,这个对于判断state 6的dot很关键
  3. 从0开始遍历string,根据state machine写code,假设c为当前字符,我们考虑以下情况
    1. 当c为数字
    2. 当c为'+'或者'-'
    3. 当c为'.'
    4. 当c为'e', 这时要注意从s6到s3这条, 这里的条件为 state = s6 && hasNum,这样才可以进入s3
    5. 其他返回false
  4. 最后判断state是否在2, 5, 7以及 (state == 6 && hasNum)

Java:

Time Complexity - O(n),Space Complexity - O(1)

public class Solution {
public boolean isNumber(String s) {
if (s == null || s.length() == 0) {
return false;
}
s = s.trim();
int state = 0;
boolean hasNum = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
hasNum = true;
if (state <= 2) {
state = 2;
} else {
state = (state <= 5) ? 5 : 7;
}
} else if (c == '+' || c == '-') {
if (state == 0 || state == 3) {
state++;
} else {
return false;
}
} else if (c == '.') {
if (state <= 2) {
state = 6;
} else {
return false;
}
} else if (c == 'e') {
if (state == 2 || state == 7 || (state == 6 && hasNum)) {
state = 3;
} else {
return false;
}
} else {
return false;
}
}
return state == 2 || state == 5 || state == 7 || (state == 6 && hasNum);
}
}

三刷:

依然是画图使用state machine的方法。 上面的图有一个地方画错了, state 6的时候,不应该有一条自己连自己的链。需要找到一种更好的办法描述state 6的终止条件,和跳到state 3的条件。 state 6跳到state 3需要 hasNum + exp, 而终止时需要hasNum。

Java:

public class Solution {
public boolean isNumber(String s) {
if (s == null || s.length() == 0) return false;
s = s.trim();
int state = 0;
boolean hasNum = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
hasNum = true;
if (state <= 2) state = 2;
else if (state < 5) state = 5;
else if (state == 6) state = 7;
} else if (c == '.') {
if (state < 3) state = 6;
else return false;
} else if (c == 'e') {
if (state == 2 || (state == 6 && hasNum) || state == 7) state = 3;
else return false;
} else if (c == '+' || c == '-'){
if (state == 0 || state == 3) state++;
else return false;
} else {
return false;
}
} return state == 2 || state == 5 || state == 7 || (state == 6 && hasNum);
}
}

Reference:

http://postimg.org/image/n7lsslmgz

https://leetcode.com/discuss/13691/c-my-thought-with-dfa

https://leetcode.com/discuss/55915/lol-hard-to-understand-but-fast-8ms

https://leetcode.com/discuss/9013/a-simple-solution-in-cpp

https://leetcode.com/discuss/26682/clear-java-solution-with-ifs

https://leetcode.com/discuss/23447/a-clean-design-solution-by-using-design-pattern

https://leetcode.com/discuss/70510/a-simple-solution-in-python-based-on-dfa

https://leetcode.com/discuss/47396/ac-java-solution-with-clear-explanation

65. Valid Number的更多相关文章

  1. [leetcode]65. Valid Number 有效数值

    Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...

  2. 【LeetCode】65. Valid Number

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

  3. leetCode 65.Valid Number (有效数字)

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

  4. [LeetCode] 65. Valid Number 验证数字

    Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...

  5. Leetcode 65 Valid Number 字符串处理

    由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题. 题意:判断字符串是否是一个合法的数字 定义有符号的数字是(n),无符号的数字是(un),有符号的兼容无符号的 合法的数字只有下列几种 ...

  6. LeetCode 65 Valid Number

    (在队友怂恿下写了LeetCode上的一个水题) 传送门 Validate if a given string is numeric. Some examples: "0" =&g ...

  7. 【一天一道LeetCode】#65. Valid Number

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Validat ...

  8. 65. Valid Number 判断字符串是不是数字

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

  9. 65. Valid Number *HARD*

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

随机推荐

  1. MySQL数据库主从复制

    一.MySQ主从复制(主库写入数据,从库读取数据) MySql官方下载地址:http://dev.mysql.com/downloads/mysql/ MySql常用命令: 设置密码 UPDATE U ...

  2. R语言基础(二) 可视化基础

    > which.max(apply(x[c("x1","x2","x3")], 1, sum))49 > x$num[which ...

  3. 表达式语言之EL表达式

    1.EL的用法EL的起源:起源于JSTL.EL运算符: 算术型:+.-.*./.div.%.mod.其中/和div都表示求除.%和mod表示求余数. 逻辑型:and或&&.or或||. ...

  4. 【http】http/1.1 八种请求方式

    OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法.也可以利用向Web服务器发送'*'的请求来测试服务器的功能性. HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回 ...

  5. 【h5-egret】如何快速开发一个小游戏

    1.环境搭建 安装教程传送门:http://edn.egret.com/cn/index.php?g=&m=article&a=index&id=207&terms1_ ...

  6. 30款jQuery常用网页焦点图banner图片切换 下载

    1.jquery 图片滚动特效制作 slide 图片类似窗帘式图片滚动 查看演示 2.jquery幻灯片插件带滚动条的圆形立体图片旋转滚动 查看演示 3.jQuery图片层叠旋转类似洗牌翻转图片幻灯片 ...

  7. android 开启或者隐藏软键盘

    一. 隐藏软键盘方法一(注:此方法本人使用时发现isActivie()失效,建议还是用其他方法..): InputMethodManager imm = (InputMethodManager)get ...

  8. asp.net中json格式化及在js中解析json

    类: public class UploadDocumentItem { public UploadDocumentItem() { } public string DocMuid { get; se ...

  9. TS流格式(转)

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  10. PHP 中的BOM BUG

    对于PHP,一个小小让我不敢置信的事情很多,包括引用变量哪么迟钝,普通变量哪么牛B我己经很意外,甚至现在竟然出现了BOM头的BUG. 在PHP中,会引用很多小文件,include或require,哪么 ...