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.
链接: 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,画图的方法。我们详细地分解一下每个步骤。
- 首先还是上面的图, 我们先对s进行trim操作,去除头尾的空格space
- 设置一个变量hasNum来判断在string中是否曾经出现过数字,这个对于判断state 6的dot很关键
- 从0开始遍历string,根据state machine写code,假设c为当前字符,我们考虑以下情况
- 当c为数字
- 当c为'+'或者'-'
- 当c为'.'
- 当c为'e', 这时要注意从s6到s3这条, 这里的条件为 state = s6 && hasNum,这样才可以进入s3
- 其他返回false
- 最后判断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的更多相关文章
- [leetcode]65. Valid Number 有效数值
Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...
- 【LeetCode】65. Valid Number
Difficulty: Hard More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...
- leetCode 65.Valid Number (有效数字)
Valid Number Validate if a given string is numeric. Some examples: "0" => true " ...
- [LeetCode] 65. Valid Number 验证数字
Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...
- Leetcode 65 Valid Number 字符串处理
由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题. 题意:判断字符串是否是一个合法的数字 定义有符号的数字是(n),无符号的数字是(un),有符号的兼容无符号的 合法的数字只有下列几种 ...
- LeetCode 65 Valid Number
(在队友怂恿下写了LeetCode上的一个水题) 传送门 Validate if a given string is numeric. Some examples: "0" =&g ...
- 【一天一道LeetCode】#65. Valid Number
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Validat ...
- 65. Valid Number 判断字符串是不是数字
[抄题]: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " ...
- 65. Valid Number *HARD*
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
随机推荐
- Sql Server数据库
1.表分区 http://www.cnblogs.com/huangxincheng/p/3565755.html 2.MVP教程地址:http://www.cnblogs.com/lyhabc/p/ ...
- 利用ajax在javascript中获取后台的值
<script type="text/javascript"> function login() { var sa = WebForm1.Hello().value; ...
- Linux的网卡由eth0变成了eth1,如何修复?
使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生成了eth1网卡,这可以使用ifconfig命令看的到. ...
- 对现有Hive的大表进行动态分区
分区是在处理大型事实表时常用的方法.分区的好处在于缩小查询扫描范围,从而提高速度.分区分为两种:静态分区static partition和动态分区dynamic partition.静态分区和动态分区 ...
- 【转载】mysql 四种隔离级别分析
sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...
- IBM MQ Reason 2538(MQRC_HOST_NOT_AVAILABLE) 错误原因一例
环境: .NET 4.0, MQ .NET客户端 IBM.XMS(v2.0.0.3) 测试代码如下: var factoryFactory = XMSFactoryFactory.GetInstanc ...
- IOS 基于APNS消息推送原理与实现(JAVA后台)
Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...
- 构件图 Component Diagram
构件图是显示代码自身结构的实现级别的图表.构件图由诸如源代码文件.二进制代码文件.可执行文件或动态链接库 (DLL) 这样的构件构成,并通过依赖关系相连接 下面这张图介绍了构件图的基本内容: 下面这张 ...
- Careercup - Facebook面试题 - 5765850736885760
2014-05-02 10:07 题目链接 原题: Mapping ' = 'A','B','C' ' = 'D','E','F' ... ' = input: output :ouput = [AA ...
- DevExpress GridControl使用(转)
DevExpress GridControl使用 (一)原汁原味的表格展示 Dev控件中的表格控件GridControl控件非常强大.不过,一些细枝末节的地方有时候用起来不好找挺讨厌的.使用过程中,多 ...