判断所给的字符串是不是数字。
这是一道hard难度的题,它的难度不是思路有多难想,而是情况种类繁多。由于样例数据只给了简单的情况,所以自己在思考的时候就没想到那么多复杂情况。每次Wrong Answer之后才知道还有这种操作。由于本人的水平有限,这道题自己没ac过去,下面是借鉴一位大佬的方法。
大佬采用的方法就是利用各种flag结合字符串当前位置上的值判断该字符串是否合理。代码如下:
/*如果我们看到数字,就将numberFlag设为true
*如果看到小数点,则判断是否已有小数点或是e,因为e后只能有整数
*e只能遇到一次,如果第一次遇到e但是没有遇到数字,则返回错误。遇到第一个e后,将numberAfterE flag标注为否以便判断后序是否有数字
*正负号的位置只能位于最开始和e紧邻着右边那个位置
*/
public boolean isNumber(String s){
s = s.trim();//除去字符串开头和结尾空格
boolean pointSeen = false;
boolean eSeen = false;
boolean numberSeen = false;
boolean numberAfterE = true;
for(int i=0; i<s.length(); i++) {
//当前值为数字
if('0' <= s.charAt(i) && s.charAt(i) <= '9') {
numberSeen = true;
numberAfterE = true;
//遇到小数点
} else if(s.charAt(i) == '.') {
//已经遇到小数点或是e,则出错
if(eSeen || pointSeen) {
return false;
}
pointSeen = true;
//遇到e
} else if(s.charAt(i) == 'e') {
//已经遇到e或是尚未遇到数字
if(eSeen || !numberSeen) {
return false;
}
numberAfterE = false;
eSeen = true;
//遇到正负号,只能在首位或是e后面
} else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
if(i != 0 && s.charAt(i-1) != 'e') {
return false;
}
//遇到其它符号一定是错的
} else {
return false;
}
}
//是否遇到小数点或是e均不重要
return numberSeen && numberAfterE;
}
运行结果(3ms):