题目:
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.
解法:这种逻辑题比较恶心,需要考虑各种恶心的情况,关键是有些不太合理的字符串也被认为是合理的 - - !
下面先列出需要特殊处理的字符,包括“ ”,“.”,“e”,“+”,“-”
他们应该遵从的规则如下:
1)允许空格前缀和空个后缀,但不允许中间用空格,即使是特殊符号的前后;
解决方法是找到第一个不是空格的字符,再开始检查,当再次检查到空格时,标记字符串以及结束,如果后面还有非空格字符,return false
2)小数点符号前不能出现指数符e(即指数不能为小数),不能出现多个小数点;
解决方案是设置两个boolean 分别表示是否出现e或E,以及是否出现过小数点
3)+,-号前面不能有数字,不能出现过+,-号,不能有小数点(即小数部分不能有符号)
解决方法也是设置boolean变量,一个标志前面是否有数字,一个标示前边是否有正负号
4)e或E符号比较特殊,它将字符串分割为两个部分,因此,经过e或E后,hasNumber,hasPoint,hasSign都必须重置,另外e或E之前必须有数字,不能出现过e或E
代码如下:
public class No66_ValidNumber {
public static void main(String[] args){
System.out.println(isNumber("101"));
System.out.println(isNumber(""));
System.out.println(isNumber("32.e-80123"));
System.out.println(isNumber(" 0.01 "));
System.out.println(isNumber(" -1"));
System.out.println(isNumber("0 1"));
System.out.println(isNumber("1a1"));
System.out.println(isNumber("1e2"));
System.out.println(isNumber("--"));
System.out.println(isNumber("1e2"));
System.out.println(isNumber("e"));
System.out.println(isNumber(".1"));
System.out.println(isNumber(".-4"));
System.out.println(isNumber("1e1.4"));
System.out.println(isNumber("1e-4"));
System.out.println(isNumber("-1."));
}
public static boolean isNumber(String s) {
if(s.length() == 0) return false;
int i = 0;
boolean hasSign = false;
boolean hasPoint = false;
boolean isEnd = false;
boolean hasExp = false;
boolean hasNumber = false;
while(i < s.length() && s.charAt(i) == ' ') i++;
if(i == s.length()) return false;
for(;i<s.length();i++){
char c = s.charAt(i);
if(c == ' '){
isEnd = true;
continue;
}
if(c == '+' || c == '-'){
if(hasNumber || hasPoint || isEnd || hasSign) return false;
hasSign = true;
continue;
}
if(c == '.'){
if(hasExp || isEnd || hasPoint ) return false;
hasPoint = true;
continue;
}
if(c == 'e'|| c == 'E'){
if(!hasNumber || isEnd || hasExp) return false;
hasExp = true;
hasSign = false;
hasPoint = false;
hasNumber = false;
continue;
}
if(c >= '0' && c <= '9'){
if(isEnd) return false;
hasNumber = true;
continue;
}
else return false;
}
return hasNumber;
}
}