题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
示例1
输入
“123.45e+6”
返回值
true
示例2
输入
“1.2.3”
返回值
false
这道题没有太多技巧,只需要使用if-else列出所有情况即可,使用两个变量can_e
和can_dot
表示是否能够出现这些字符,+
和-
只能出现在第一位或者e(E)
后面,因此当遇到加减号时直接判断即可,遍历字符串:
- 当遇到数字则继续
- 若遇到加减号,判断±号是否出现在第一位或是在e或E后,若不是则返回false,不是一个合法的数值字符串
- 若遇到e或者E,若它出现在最后一位,则返回false,不是一个合法的数值字符串;若
can_e
为true,则表明可以出现e和E,并且将can_e
置为false,表示后续不能出现e或E,同时把can_dot
置为false,因为e后面只能是整数,不能是浮点数 - 若遇到
.
,若can_dot
为true,表示可以出现小数,此时要把can_dot
置为false,因为一个数值字符串不能出现两个小数点;若can_dot
为false,则返回false,这是一个非法的字符串 - 若不是上述所有字符,直接返回false即可
若能遍历完字符串,则表明是一个数值字符串,返回true
public class Solution {
public boolean isNumeric(char[] str) {
if (str.length == 0) return false;
// 设置一些布尔值表示后续是否能出现某些字符
boolean can_e = true, can_dot = true;
for (int i = 0; i < str.length; i++) {
if (str[i] >= '0' && str[i] <= '9') continue; // 数字不管
if (str[i] == '+' || str[i] == '-') {
// +-可以出现在第一位或e之后
if (i == 0) continue;// 出现在第一位是可以的
if (!can_e && (str[i - 1] == 'e' || str[i - 1] == 'E')) continue; // 如果是在e或E后面,是可以的
return false;
} else if (str[i] == 'e' || str[i] == 'E') {
if (i == str.length - 1)
return false; // e在最后一位
if (can_e) {
can_e = false;
can_dot = false;
} else return false;
} else if (str[i] == '.') {
if (can_dot) {
can_dot = false;
continue;
}
return false;
} else return false;
}
return true;
}
}