Validate if a given string is numeric.
Examples:
“0” => true
” 0.1 ” => true
“abc” => false
“1 a” => false
“2e10” => true
翻译
验证给定的字符串是否为数字。
分析
最开始看到这个的时候就觉得很简单,为什么会是个hard,在每次提交的时候,才知道一堆坑,并且刷新了我的认识。
最初想法:
1. 先用trim()去掉头尾可能存在的空格
2. 遍历,若存在空格,直接false
3. 若存在除e外的其他字符,一样false
4. 若小数点后没有数字,依旧false (这个情况其实应该是true)
5. 小数点和e只能有一个,小数点必须在e之前
但是这样的想法缺少了一些情况,缺少的情况都在代码注释中提到了,这些情况都是在一次次submit solution中报的错误中得出来的。╮(๑•́ ₃•̀๑)╭
最终想法(作为上面缺失情况的补充)
- 上面第三点只考虑了 “e”,还需要加入对正负号判断的情况
- e的前面后面需要判断是否有数字
- 小数点前面和后面可以没有数字
- 考虑 “+” , “-” , “e” , “.” 不能混着
java代码
class Solution {
public boolean isNumber(String s) {
//num记录数字个数,words记录字母个数,dot记录点的个数
int num = 0, words = 0, dot = 0, i = 0;
s = s.trim();
int len = s.length();
//先排除 "", "xxe", "xxe+", "xxe-" 情况
if (s.length() == 0 || s.charAt(s.length() - 1) == 'e' || s.charAt(s.length() - 1) == '+' || s.charAt(s.length() - 1) == '-')
return false;
//如果是"-xxx"或"+xxx",第一个带有正或负的符号,下标后移跳过第一个符号。
if (s.charAt(0) == '-' || s.charAt(0) == '+') {
len--;
i++;
}
for (; i < s.length(); i++) {
//排除 "+e", "-e"
if ((len == 1 && s.charAt(i) == 'e') || (len == 1 && s.charAt(i) == '.')) {
return false;
} else if ((s.charAt(i) == 'e' && words != 1) && num != 0) {
//遍历到"e"时,前面没有其他字母并且有数字,就算是合格的,做下记录
words++;
} else if ((s.charAt(i) == '.' && dot != 1) && words != 1) {
//遍历到"."时,前面没有"."并且没有"e",就算是合格的,做下记录
dot++;
} else if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
//记录数字
num++;
} else if (s.charAt(i) == '+' || s.charAt(i) == '-') {
// 排除 "xxe+","xxe-" 情况
if (s.charAt(i - 1) != 'e') {
return false;
}
} else {
return false;
}
}
//排除 "xxe."
if (s.charAt(s.length() - 1) == '.' && words != 0)
return false;
return true;
}
}