题目:
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;
}
else
return false;
}
else
return 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;
}
else
return false;
}
else if(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9')
continue;
else
return false;
}
}
else
return false;
}
else
return false;
}
return true;
}
}