有效数字这道题情况很复杂,但是你一旦理清了情况,写起来也不是很难。
笔者参考了Leetcode讨论区的答案,有个小哥写的真是漂亮。
我这里理一下基本逻辑。
首先先处理空格。
我们期待的数据形式大概是如下
可有可无的+/-号(最多有一个)
数字
可有可无的小数点
小数点后的数字可有可无
E,科学计数位 可有可无
E之后可能有符号位。
如果有E,之后一定要有数字
所以设计几个flag
- numberBeforeESeen
- numberAfterESeen
- eSeen;
- pointSeen;
如果numberBeforeESeen是false, 肯定不行
如果eSeen,但是numberAfterESeen false也不行。
所以最后结果是 return numberBeforeESeen && eSeen ? numberAfterESeen : true;
然后就是分各种情况讨论。
如果遇到数字怎么办
如果遇到+/-号怎么办
如果遇到E怎么办
如果遇到point怎么办。
如果遇到其他怎么办。
看下代码. 你看这代码可以写的很漂亮(参考别人的)
看到这种复杂问题不要怵, 一点一点分析。
public boolean isNumber(String s) {
if (s == null) return false;
s = s.toLowerCase().trim();
boolean eSeen = false, numberBeforeESeen = false, numberAfterESeen = false;
boolean pointSeen = false;
int pt = 0;
while (pt < s.length() ) {
char ch = s.charAt(pt);
if (Character.isDigit(ch)) {
if (eSeen) numberAfterESeen = true;
else numberBeforeESeen = true;
} else if (ch == '.') {
if (eSeen || pointSeen) return false;
pointSeen = true;
} else if (ch == '+' || ch == '-') {
if (pt != 0 && s.charAt(pt - 1) != 'e') {
return false;
}
} else if (ch == 'e' || ch == 'E') {
if (eSeen || (!numberBeforeESeen)) return false;
eSeen = true;
} else return false;
pt++;
}
return numberBeforeESeen && (eSeen ? numberAfterESeen : true);
}
网友评论