验证给定的字符串是否为数字。
这个题最恶心之处在于给你的样例太少,而实际中的情况却非常复杂。很多很多意想不到的情况,不断地WA......
这个题做的人难受的一批,查了一下还是我太嫩了,大佬们都是用有限状态机来做的(不会、不存在的、下一个...)......
下面是AC代码:
import java.util.Scanner;
public class leetcode65 {
public boolean isNumber(String s) {
s = s.trim(); //删除前后空格
if(s.length()<1) //那就是全是空格咯
return false;
boolean e=false , dian=false , number = false , fuhao = false;
/*
e 字母e,大坑
fuhao 有没有正负号 +-
dian 有没有点 .
number 有无数字
*/
for (int i = 0 ; i < s.length() ; i++ ) {
if ( s.charAt(i) == '-' || s.charAt(i) == '+' ){ //判断正负号
if(!fuhao && (i==0 || s.charAt(i-1)=='e' && i < s.length()-1 ))
fuhao = true; //符号变成有(true)
else
return false;
}
else if(s.charAt(i)=='.'){ //判断小数点的有无
if(s.length()!=1 && !dian && !e)
dian = true;//点变成有
else
return false;
}
else if(s.charAt(i)=='e'){ //坑爹的字母e
if(number && !e && i<s.length()-1){ // e前面必须要有数字,所以引入number来判断
e = true;
fuhao = false; // 因为有像 24e+6,7e-4 这种情况,一旦出现e了,fuhao-->false
}
else
return false;
}
else if(s.charAt(i)>='0' && s.charAt(i)<='9'){
if(!number) //判断是否输入了数字
number=true;
}
else {
return false;
}
}
if(number)
return true;
else
return false;
}
public static void main(String[] args) {
Scanner map = new Scanner(System.in);
leetcode65 lt = new leetcode65();
String s = map.next();
System.out.println(lt.isNumber(s));
}
}