https://leetcode.com/problems/valid-number/
这道题本身不难,就是各种情况乱七八糟,要求也给得不清楚。最开始我自己写的代码简直惨不忍睹,各种condition各种与或非,见下面被注释掉的代码。
后来参考了九章算法的答案,才发现用几个boolean变量就能表达得很清楚了。
num: 表示还需要出现数字,在一开始或者e出现后,都还需要数字。
exp: 表示前面已经出现过e了
dot: 表示前面出现过小数点了
最后返回num,即需要的数字是否出现了。
public class Solution {
public boolean isNumber(String s) {
if(s==null || s.length()==0) return false;
int i = 0;
while(i<s.length() && s.charAt(i)==' ') i++;
if(i==s.length()) return false;
if(s.charAt(i)=='+' || s.charAt(i)=='-') i++;
if(i==s.length()) return false;
boolean dot = false;
boolean exp = false;
boolean num = false;
while(i<s.length()){
char c = s.charAt(i);
if(Character.isDigit(c)) num= true;
else if(c == '.'){
if(exp || dot) return false;
else dot = true;
}
else if(c == 'e'){
if(!num || exp) return false;
exp = true;
num = false;
}
else if(c == '+' || c == '-'){
if(i==0 || s.charAt(i-1)!='e') return false;
}
else if(c == ' '){
while(i<s.length() && s.charAt(i)==' ') i++;
if(i==s.length()) break;
else return false;
}
else return false;
i++;
// if(c>'9' || c<'0'){
// if(c == '.'){
// if(!point){
// if((i>0 && s.charAt(i-1)<='9' && s.charAt(i-1)>= '0')
// || (i<(s.length()-1) && s.charAt(i+1)<='9' && s.charAt(i+1)>= '0'))
// point = true;
// else return false;
// }
// else return false;
// }
// else if(c == 'e'){
// if(i>0 && s.charAt(i-1)<='9' && s.charAt(i-1)>= '0' && (!exp) && i<(s.length()-1)
// && s.charAt(i+1)<='9' && s.charAt(i+1)>= '0') exp = true;
// else return false;
// }
// else if(c == ' '){
// while(i<s.length() && s.charAt(i)==' ') i++;
// if(i==s.length()) return true;
// else return false;
// }
// else return false;
// }
// i++;
}
return num;
}
}