您的位置:首页 > 编程语言 > Java开发

65. Valid Number-leetcode-java

2016-05-06 18:44 471 查看


【原来在SAE的blog上,都转到CSDN了。。】


65.
Valid Number-leetcode-java

发表于 2016/02/10



题目:

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.

更新:午饭之后再来战,终于把几个case 过了,终于AC了。。。

回顾自己的第一次AC,真的是为了AC而AC,应有的思路应该是先分析好问题,再解决问题。不过,wrong answer那么多次最后没有狗带,也是蛮幸运。。。

题意就是给定一个字符串,判断是否合法,期间注意考虑各种情况,合法的不合法的。case好多啊……此题整了一上午,最终以1458/1481 case之后觉得无力再爱

1458/1481 case的代码,我觉得还可以完善的。。

case到这里,我发现我只是在做题,对于e我一直没想明白这样表示是啥,为啥无理数e放在这里,不怕被鄙视,我承认我一直想的是无理数。后来百度了下,才恍然。所以,对于'e',最多只允许出现1次,其前后都必须有数字,但后面一定是整数,即不能出现'.';

引自百度:3.2e10是计算器显示的结果.是显示的科学计数法,e代表的意思是x10的n次方,也就是3.2X10的10次方.

我就是用普通方法判断各种case的。在家里比较闲,截取了部分提交历史。。

















在经历了N多次的提交,wrong answer外加几次超时,最终终于修改成功,AC了。。。

以下是pass的java代码,其实就是根据case来的,每次看看又有啥case没有过,就继续加条件……

public class Solution {

public boolean isNumber(String s) {

boolean result=true;

String str=s.trim();

if(str==null || str.length()<1) return false;

if(str.length()==1){

if(str.charAt(0)>='0' && str.charAt(0)<='9') return true;

if(str.charAt(0)<'0' || str.charAt(0)>'9') return false;

}

int len=str.length();

if(str.charAt(0)=='e'||str.charAt(len-1)=='e') return false;

if(str.contains(" ")) return false;

if(str.charAt(0)=='-'||str.charAt(0)=='+')

{

str=str.substring(1,len);

}

if(str.charAt(0)=='e') return false;

if(str.charAt(0)=='.' && str.length()==1) return false;

for(int i=0;i<str.length();i++){

if(str.charAt(i)<'0' || str.charAt(i)>'9'){

if(str.charAt(i)=='.'){

for(int j=i+1;j<str.length();j++){

if(str.charAt(0)=='.' && str.charAt(1)=='e') return false;

if(str.charAt(j)<'0'||str.charAt(j)>'9') {

if(str.charAt(j)=='e' || (str.charAt(j)=='-'&&str.charAt(j-1)=='e') || (str.charAt(j)=='+'&&str.charAt(j-1)=='e') )

{continue;}

return false;}

}

return true;

}

if(str.charAt(i)=='e'){

if(str.charAt(i+1)=='+'||str.charAt(i+1)=='-'){

for(int j=i+2;j<str.length();j++){

if(str.charAt(j)<'0'||str.charAt(j)>'9') return false;

}

for(int j=i+2;j<str.length();j++){

if(str.charAt(j)>='0'&& str.charAt(j)<='9') return true;

}

}else{

for(int j=i+1;j<str.length();j++){

if(str.charAt(j)<'0'||str.charAt(j)>'9') return false;

}

for(int j=i+1;j<str.length();j++){

if(str.charAt(j)>='0'&& str.charAt(j)<='9') return true;

}

}

}

return false;

}

}

return result;

}

}

然后去百度了。。结果发现用 有限状态机 做,会很方便,那么接下来要学习这个方法。
http://blog.csdn.net/suwei19870312/article/details/12094233  这篇文章讲的有限状态机挺好的。

还有一篇 http://noalgo.info/995.html

更新:啊,又发现一个超级简洁的方法,其实人家可能考察的只是正则表达式,代码好短啊!好惭愧。

网上的解法:

public
 
class
 
S65
{ 


  


    
public
 
static
 
void
 
main(String[]
args) { 


  


    


  


    
public
 
boolean
 
isNumber(String
s) { 


        
if
(s.trim().isEmpty()){ 


            
return
 
false


        


        
String
regex = 
"[-+]?(\\d+\\.?|\\.\\d+)\\d*(e[-+]?\\d+)?"

        
if
(s.trim().matches(regex)){ 


            
return
 
true


        
}
else


            
return
 
false


        


    




看了下面这个例子,对正则表达式更加理解了些,再看上面这句就好理解了,给了很大帮助:


 ^[+-]?\d*[.]?\d*$

^是界定符,表示匹配字符串的开始;
[+-],中括号表示其内的内容都是符合要求的匹配,所以这个表示“+”或者"-";
\d,[0-9]的简写形式,也就是匹配数字;
$也是界定符,表示匹配字符串的结束;
了解以上之后再来看问号(?)和星号(*):跟在一个模式内容后面的是量词,用来限定模式内容匹配的次数,例如我想要匹配最少1个、最多3个数字,例如4、20、123、226这样的,先前已经解释过单个数字可以用[0-9]或者\d表示,那么怎么表示最少匹配1次、最多3次呢?

很简单,就在模式后面加上大括号配合次数表示量词,形式为{下限,上限},就是这样[0-9]{1,3}或者\d{1,3}。类似的,[0-9]{2}就表示只能匹配2个数字(多一个少一个都不行),[0-9]{2,}表示至少要有2个数字最多不限(注意大括号内的逗号),[0-9]{,2}表示最多有2个数字(注意大括号的逗号)。
针对经常用的量词,正则中也有简写,

{0,1}简写就是问号(要么没有要么只有一次),

{0,}简写就是星号(随便有没有也不限次数),

{1,}简写就是加号(至少有一次)


发表在 leetcode
| 标签有 javaleetcode有限状态机正则表达式
发表回复
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: