Leetcode 65. Valid Number
来源:互联网 发布:硬座火车座位图片知乎 编辑:程序博客网 时间:2024/05/20 21:46
65. Valid Number
Total Accepted: 44911 Total Submissions: 372033 Difficulty: Hard
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.
写这题之前没想着有多么繁琐,也对科学进制一无所知。写完之后... 强行根据错误debug,最后通过了。总结的规律在code里注释了。
public class Solution { public boolean isNumber(String sss) { if(sss==null || sss.length()==0) return false; String ss = sss.toLowerCase().trim(); //////// 去除两端空格,并且变为小字符 if(ss.length()==0) return false; /////////// " " -> false boolean dot = false; boolean exp = false; String s; if(ss.charAt(0)=='-' || ss.charAt(0)=='+') s=ss.substring(1, ss.length()); // 如果开始有正负号,那么跳过开始的字符 else s=ss.substring(0, ss.length()); for(int i=0; i<s.length(); i++){ if(s.charAt(i)=='+' || s.charAt(i)=='-'){ // 如果碰到+ or -,则必须与e匹配 if(i==0 || i==s.length()-1 || s.charAt(i-1)!='e') return false; else continue; } if(!(s.charAt(i)=='e' || s.charAt(i)=='.' || (s.charAt(i)-'0'>=0 && s.charAt(i)-'0'<=9))) return false; // 碰到其他字符直接false if(s.charAt(i)=='.'){ // 碰到. 则必须e没出现过;而且是第一次出现.;并且不能为"." if(dot==false && s.length()!=1 && exp == false) { dot = true; continue; } else return false; } if(s.charAt(i)=='e'){ // 碰到e if(i==0 || i==s.length()-1 || exp!=false) return false; // 如果在0或者末尾,则无法匹配;或者e已经出现过则false。 if(s.charAt(i-1)=='.'){ // 如果e前面是.,则需要.前面是正常的数字 if(i-1>0 && (s.charAt(i-2)-'0'>=0 && s.charAt(i-2)-'0'<=9)) { exp = true; continue;} else return false; } exp = true; continue; } } return true; }}
除自己的方法之外,网上有个比较优雅的版本。
其思路如下:
这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。对于小数点出现的时候,我们要满足一下这些条件:(1)前面不能有小数点或者‘e’和‘E’;(2)前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。对于正负号出现的情况,要满足条件:(1)必须是第一位或者在‘e’和‘E’后一位;(2)后一位要是数字。对于‘e’和‘E’的情况,要满足:(1)前面不能有‘e’和‘E’出现过;(2)不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。根据上面列举的情况,我们用两个标签和做前后位的判断来实现,算法复杂度比较明显是O(n)的,只需要O(1)的额外空间。
其代码如下:
public boolean isNumber(String s) { if(s==null) return false; s = s.trim(); if(s.length()==0) return false; boolean dotFlag = false; boolean eFlag = false; for(int i=0;i<s.length();i++) { switch(s.charAt(i)) { case '.': if(dotFlag || eFlag || ((i==0||!(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')) && (i==s.length()-1||!(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9')))) return false; dotFlag = true; break; case '+': case '-': if((i>0 && (s.charAt(i-1)!='e' && s.charAt(i-1)!='E')) || (i==s.length()-1 || !(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'||s.charAt(i+1)=='.'))) return false; break; case 'e': case 'E': if(eFlag || i==s.length()-1 || i==0) return false; eFlag = true; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; default: return false; } } return true;}
0 0
- LeetCode --- 65. Valid Number
- [Leetcode] 65. Valid Number
- [LeetCode]65.Valid Number
- Leetcode-65.Valid Number
- 【leetcode】65.Valid Number
- leetcode 65. Valid Number
- LeetCode 65. Valid Number
- Leetcode 65. Valid Number
- LeetCode 65. Valid Number
- LeetCode - 65. Valid Number
- [LeetCode] 65. Valid Number
- leetcode 65.Valid Number
- leetcode 65. Valid Number
- leetcode 65.Valid Number
- Leetcode--65. Valid Number
- leetcode-65. Valid Number
- Leetcode 65. Valid Number
- 【LeetCode】65. Valid Number
- Java中弱引用、软引用、虚引用及强引用的区别
- nil,Nil,NULL的区别
- 怎么添加项目到SVN上面
- Android客户端发送Get和Post请求
- IOS开发通知与消息机制
- Leetcode 65. Valid Number
- hadoop之sequenceFile
- ExtJS -- form提交之取ComboBox的值
- IBM Swift Sandbox-在PC上写Swift小程序
- 86. Partition List
- Android官方开发文档Training系列课程中文版:打印内容之自定义文档打印
- POJ 3352 边双联通
- sed进行文件简单处理
- 新大厅任务