题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
练习地址
https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2
参考答案
和书上稍微不同,但更易于理解,且时间复杂度相同。
public class Solution {
public boolean isNumeric(char[] str) {
if (str == null || str.length == 0) {
return false;
}
boolean hasDot = false, hasE = false;
for (int i = 0; i < str.length; i++) {
if (str[i] == '.') {
if (hasDot) {
// 已经出现过'.'
return false;
} else {
hasDot = true;
}
} else if (isE(str[i])) {
if (hasE) {
// 已经出现过'E'
return false;
}
// 'E'后面不会再出现'E'和'.'
hasE = true;
hasDot = true;
} else if (isPlusMinus(str[i])) {
if (i != 0 && (!hasE || !isE(str[i - 1]))) {
// '+''-'不是第一个且前面不是'E'
return false;
}
} else if (!isNumber(str[i])) {
return false;
}
}
// 最后一个不是'E'
return !isE(str[str.length - 1]);
}
private boolean isE(char c) {
return c == 'E' || c == 'e';
}
private boolean isPlusMinus(char c) {
return c == '+' || c == '-';
}
private boolean isNumber(char c) {
return c >= '0' && c <= '9';
}
}
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
网友评论