题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
练习地址
https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/
参考答案
class Solution {
private int i;
public boolean isNumber(String s) {
if (s == null) {
return false;
}
char[] str = s.trim().toCharArray();
i = 0;
boolean numeric = scanInteger(str);
// 如果出现'.',则接下来是数字的小数部分
if (i < str.length && str[i] == '.') {
i++;
// 下面一行代码用||的原因:
// 1. 小数可以没有整数部分,如 .123 等于 0.123;
// 2. 小数点后面可以没有数字,如 233. 等于 233.0;
// 3. 当然,小数点前面和后面可以都有数字,如 233.666
numeric = scanUnsignedInteger(str) || numeric;
}
// 如果出现 'e' 或者 'E',则接下来是数字的指数部分
if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
i++;
// 下面一行代码用&&的原因:
// 1. 当 e 或 E 前面没有数字时,整个字符串不能表示数字,如 .e1、e1;
// 2. 当 e 或 E 后面没有整数时,整个字符串不能表示数字,如 12e、12e+5.4
numeric = numeric && scanInteger(str);
}
return numeric && i == str.length;
}
private boolean scanUnsignedInteger(char[] str) {
int before = i;
while (i < str.length && str[i] >= '0' && str[i] <= '9') {
i++;
}
// 当 str 中存在若干 0~9 的数字时,返回 true
return i > before;
}
private boolean scanInteger(char[] str) {
if (i == str.length) {
return false;
}
if (str[i] == '+' || str[i] == '-') {
i++;
}
return scanUnsignedInteger(str);
}
}
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。