题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路
没什么技巧性,就只能靠if-else硬怼。判断条件很多,很难一次性考虑周全。这题基本是一点点挤牙膏,试错试出来的。
代码
public class Solution {
public boolean isNumeric(char[] str) {
int len = str.length;
boolean hasE=false, hasDot=false;
if(len==0)
return false;
if(len==1)
return isDigit(str,0);
for(int i=0;i<len;i++){
char cur = str[i];
if(isDigit(str,i))
continue;
else if(cur=='e'||cur=='E'){
//e只能出现一次
if(hasE) return false;
//e不能出现在开头也不能出现在末尾
if(i==0||i==len-1) return false;
hasE=true;
}
else if(cur=='-'||cur=='+'){
//符号不能在末尾
if(i==len-1)
return false;
//符号位要么在一开始要么在e后
if(i!=0&&str[i-1]!='E'&&str[i-1]!='e')
return false;
}
else if(cur=='.'){
//e后不能有小数点,小数点只能出现一次。
if(hasE||hasDot) return false;
//小数点左右必有一位为数字
if(!isDigit(str, i+1)&&!isDigit(str, i-1)) return false;
hasDot=true;
}
else
return false;
}
return true;
}
boolean isDigit(char[] s, int i){
if(i<0||i>s.length)
return false;
if(s[i]>='0'&&s[i]<='9')
return true;
return false;
}
}