[LeetCode][Java] Valid Number

来源:互联网 发布:seo外包服务yuanbig 编辑:程序博客网 时间:2024/05/20 22:36

题目:

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.

题意:

验证给定的字符串是否表示一个数。

一些例子:

"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

注意: 问题的描述不是特别的明确,在实现算法之前,你需要收集所有的要求。

算法分析:

        当时第一遍刷leetcode的时候,这个题是通过率最低的一道。AC之后才发现,不是算法本事特别的复杂,是测试的样例各种各样,想不到啊。不提交都没法调试。算法不

复杂,只要你把所有的情况都能想到就行。真是为了AC而AC。

        这当然不是搞算法的人应有的态度(囧)。正确的套路好像是先分析问题,再解决问题哦。

        参考http://pisxw.com/algorithm/Valid-Number.html

       基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。

对于小数点出现的时候,我们要满足一下这些条件: 
1. 前面不能有小数点或者‘e’和‘E’; 
2. 前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。

对于正负号出现的情况,要满足条件: 
1. 必须是第一位或者在‘e’和‘E’后一位; 
2. 后一位要是数字。

对于‘e’和‘E’的情况,要满足: 
1. 前面不能有‘e’和‘E’出现过; 
2. 不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。

AC代码:

public class Solution {    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;    }}


这里也把自己第一遍AC的代码贴出来吧,全当是记录了

public class Solution {    public boolean isNumber(String s)    {int dotnum=0;int expnum=0;int signnum=0;String tems="";String nosigns="";s=s.trim();    if(s==null||s.length()==0)return false;for(int i=0;i<s.length();i++){if(s.charAt(i)>='0'&&s.charAt(i)<='9'){continue;}else if(s.charAt(i)=='-'&&i==0||s.charAt(i)=='+'&&i==0){signnum++;if(signnum>1)return false;nosigns=s.substring(1);s= new String(nosigns);i=-1;}else if(s.charAt(i)=='e'){expnum++;if(expnum>1)return false;if(i-1>=0&&i+1<=s.length()-1){  if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'&&s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'||s.charAt(i-1)=='.'||(s.charAt(i+1)=='-'&&i+1!=s.length()-1)||(s.charAt(i+1)=='+'&&i+1!=s.length()-1)){if(s.charAt(i+1)=='+'||s.charAt(i+1)=='-')i++;if(!s.substring(i).contains("."))continue;else return false;}    elsereturn false;}elsereturn false;}else if(s.charAt(i)=='.'){dotnum++;if(dotnum>1)return false;if(i-1>=0||i+1<=s.length()-1){if(i-1>=0){if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')continue;else return false;}if(i+1<=s.length()){if(s.charAt(i+1)=='e'){if(i-1>=0){if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')continue;else return false;}elsereturn false;}else if(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9')continue;else return false;}}elsereturn false;}elsereturn false;}return true;    }}


0 0