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.
这个题真的是太难一次ac了。。没有什么技术上的难度,主要是要考虑各种奇葩情况
public class Solution {
public boolean isNumber(String s) {
if(s==null||s.length()==0)return false;
int len = s.length();
boolean posneg = false;
boolean eflag = false;
boolean space = false;
boolean point = false;
int count = 0;
for(int j=0;j<len;j++){
if(s.charAt(j)>'9'||s.charAt(j)<'0')count++;
}
if(count==len)return false;
int i = 0;
while(i<len&&s.charAt(i)==' '){
i++;
}
if(i>=len)return false;
if(i==len-1&&(s.charAt(i)<'0'||s.charAt(i)>'9'))return false;
if ((s.charAt(i)=='+'||s.charAt(i)=='-')){
i++;
posneg = true;
if(s.charAt(i)!='.'&&(s.charAt(i)<'0'||s.charAt(i)>'9'))return false;
}
for(;i<len;i++){
if(s.charAt(i)!=' '&&space){
return false;
}
if(s.charAt(i)==' '){
space = true;
continue;
}
if(s.charAt(i)=='.'){
if(!eflag&&!point){
if(i==0&&s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'){
point = true;
continue;
}
if(i==len-1&&s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'){
point = true;
continue;
}
if(i>0&&i<len-1&&((s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')||(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'))){
point = true;
continue;
}
}
return false;
}
if(s.charAt(i)>='0'&&s.charAt(i)<='9')continue;
if(s.charAt(i)=='e'&&!eflag&&i!=0&&(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'||s.charAt(i-1)=='.')&&i!=len-1){
if(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9')){
eflag = true;
continue;
}
else return false;
}
if(s.charAt(i)=='-'||s.charAt(i)=='+'){
if(s.charAt(i-1)=='e'&&i!=len-1)continue;
}
return false;
}
return true;
}
}