对某题的吐槽

#65 Valid Number

Validate if a given string is numeric.
Some examples:
“0” => true
“ 0.1 “ => true
“abc” => false
“1 a” => false
“2e10” => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

第一次看到这道题的时候我的表情是这样的 →
主要考的应该是归纳能力吧,虽然好像有很多情况的样子,但好好列出来应该也是没问题的吧?
too simple too naive

我的第一个版本:

  1. 去除首尾空格
  2. 判断第一个字符
    1. 0
    • 下一个如果不是小数点或结束 – false
    1. 其他数字
    2. 其他字符 – false
  3. 剩余字符
    1. 数字
    2. 小数点
    • 重复出现 – false
    • 下一个结束 – false
    1. 科学计数法e
    • 重复出现 – false
    • 后面跟0 –false
    • 下一个结束 – false
    1. 其他字符 – false

大致是这些吧,可能有些情况没考虑到,运行一下看看结果,再加上就好了嘛。
然后我得到了这个结果:
“01” -> true

这玩意居然是合法数字?
好咯,你给ACC你说了算咯,改呗。

然后我遇到了接下来一系列结果:
“.1” -> true
“3.” -> true
“2e0” -> true

简直颠覆了我对数字的理解

解决完这一波之后,新一波的坑正在到来,亲,你忘了还有正负号呦~
然后又得出了:
“-e58” -> false
“5e+6” -> true
“4e+” -> false

就这样查漏补缺之后,我迎来了我的ACC

后来我在讨论区看到了这个 ↓

默默点下了vote。。。

最后附上贴满补丁的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public boolean isNumber(String s) {
s = s.trim();
if (s.length() == 0 || s.charAt(0) == 'e')
return false;
if (s.charAt(0) == '-' || s.charAt(0) == '+') {
s = s.substring(1, s.length());
}
if (s.length() == 0 || s.charAt(0) == 'e')
return false;
boolean hasPoint = false, hasE = false;
for (int i = 0 ; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
continue;
}
else if (c == '.' && !hasPoint && !hasE) {
if (i == 0 && (i == s.length()-1 || s.charAt(i+1) == 'e'))
return false;
hasPoint = true;
}
else if (c == 'e' && !hasE) {
if (i == s.length()-1 || s.charAt(i+1) == '.')
return false;
if ((s.charAt(i+1) == '+' || s.charAt(i+1) == '-') && i != s.length()-2)
i++;
hasE = true;
}
else
return false;
}
return true;
}