[leetcode] 65. 有效数字
第19次才通过,前面错了18次。。。
相信我,不用理解或者分析我的代码,一遍一遍去自己尝试吧少年,十几次后你就会做出来了
你会感受到这个题带来的诚意的
class Solution {
public boolean isNumber(String s) {
// 去掉前后空格
s = s.trim();
if (s.length() == 0) return false;
if (s.charAt(0) == '-' || s.charAt(0) == '+') {
if (s.length() == 1) {
return false;
}
s = s.substring(1);
}
// 去掉前导0
while (s.charAt(0) == '0') {
if (s.length() == 1) {
// 就剩一个0了
return true;
}
if (s.charAt(1) == '.' || s.charAt(1) == 'e') {
// 应对比如0000.123这种情况
break;
}
s = s.substring(1);
}
// 处理e后面出现+-号的情况
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'e') {
if (i + 1 < s.length()) {
if (s.charAt(i + 1) == '-' || s.charAt(i + 1) == '+') {
String newS = "";
newS = s.substring(0, i + 1);
if (i + 2 < s.length()) {
newS += s.substring(i + 2);
}
s = newS;
}
}
}
}
boolean flag = false;
boolean dflag = false;
boolean eflag = false;
boolean numFlag = false;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (!isnum(ch)) {
if (ch == '.' || ch == 'e') {
if (ch == 'e') {
// e前面必须有数字,而。不用
if (!numFlag) return false;
}
if (ch == 'e' && (i + 1 >= s.length())) {
// e后面必须有数字
return false;
}
if (flag) {
// 。 or e只能出现1次
if (ch == 'e' && dflag && !eflag) {
eflag = true;
continue;
}
return false;
}
if (ch == '.' && i + 1 < s.length() && s.charAt(i + 1) == 'e' && numFlag && i + 2 < s.length()) {
// 特判: .e 同时出现时- -
i++;
}
flag = true;
if (ch == '.') dflag = true;
if (ch == 'e') eflag = true;
continue;
}
return false;
} else {
numFlag = true;
}
}
return numFlag;
}
public boolean isnum(char ch) {
return ch >= '0' && ch <= '9';
}
}