这道题是leetcode一个大坑,之前做过一次,总是差一点,后来放弃了。。今天拿出来终于写出来了
逻辑是:
1.首先把两边空格去掉
2. 判断下有没有正负号,如果有,跳过
3. 设置3个flag, 是不是Num,有没有"e",有没有" ."
这段逻辑稍微绕点,特别是当你一点点往下写,还不知道test case里到底有什么,最后就越来越乱,我重写的时候没看以前代码,这样还好点。。
首先分析下,什么是一个valid的number:
(1)"."只能有一个但是必须和数存在 只有一个".",false, '1.' true, '.2' true, '..' false '2.5' true
(2)"e"只有有一个,必须两边都有数,而且e后面的数可以有正负号"1e-10" true, 'e9' false, '7e' false
(3)"e" 和 '.' 可以有"45.e9",true, 但是不可以"45e9." why?我也不知道,我总觉"45.e9"也不是很对
如果我们知道了通关条件就是上面3个,那么就好办了
按照逻辑来,我们只要每次判断s.charAt(index)当前位置的字符char是什么就可以了,这样我们可以储存状态,通过状态来判断是否是一个有效数字
public static boolean isNumber(String s) {
if (s == null)
return false;
int start = 0, end = s.length() - 1;
while (start <= end && s.charAt(start) == ' ') {
start++;
}
while (end >= start && s.charAt(end) == ' ') {
end--;
}
if (start > end)
return false;
boolean hasNum = false;
boolean hasE = false;
boolean hasDot = false;
if (s.charAt(start) == '+' || s.charAt(start) == '-') {
start++;
}
// first judge +/-
while (start <= end) {
if (s.charAt(start) >= '0' && s.charAt(start) <= '9') {
// is number
hasNum = true;
} else if (s.charAt(start) == 'e') {
if (hasE || !hasNum)
return false;
hasE = true;
hasNum = false;
} else if (s.charAt(start) == '.') {
if (hasDot || hasE)
return false;
hasDot = true;
} else if (s.charAt(start) == '+' || s.charAt(start) == '-') {
if (s.charAt(start - 1) != 'e')
return false;
} else {
return false;
}
start++;
}
return hasNum;
}