思路:这类题需要考虑的情况特别多,一时间很难考虑周到,因此要做好不断完善代码的准备。
把输入的字符串先trim() 一下,去除两端的空格。整体转换为一个char类型的数组cc。
之后从头到尾遍历这个数组,判断处于什么情况。判断的指标整体分为三个:遇到点了吗,遇到e/E了吗,遇到数字了吗。
可以根据这个思路写代码,把正常的情况全部通过,其余的都直接返回false。
需要注意的典型错误情况为:点前后都没有数字。e前没有数字(这两个可以直接用isnum的值来判断)。正负号应该位于第一位或者E/e的后一位。
特别要注意的是代码中使用isnum来判断最终是否符合题意,e判断前面有数字后,需要将isnum=false;用来判断e后有没有数字。
最终返回isnum的值,实际上是判断没有e时,点前后是不是都没有数字。有e时,e后有没有数字。其他错误的情况都在循环遇到时直接返回false了。
class Solution {
public boolean isNumber(String s) {
//循环往后判断,标记好走到哪一位了
boolean isnum=false;
boolean isdot=false;
boolean ise=false;
if(s==null || s.equals("")){
return false;
}
char[] cc=s.trim().toCharArray();
for(int i=0;i<cc.length;i++){
if(cc[i]=='+' || cc[i]=='-'){
if(i==0 || cc[i-1]=='e'||cc[i-1]=='E'){
}else{
return false;
}
}
//遇到e之前的数
else if(cc[i]<='9' && cc[i]>='0' ){
isnum=true;
}
//遇到第一个.
else if(isdot==false && ise==false &&( cc[i]=='.' )){
isdot=true;
//遇到第一个e
}else if( ise==false && (cc[i]=='e' || cc[i]=='E')){
if(isnum==false){
return false;
}
ise=true;
isnum=false;
}else{
return false;
}
}
return isnum;
}
}