题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。
但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
注意:
小数可以没有整数部分,例如.123等于0.123;
小数点后面可以没有数字,例如233.等于233.0;
小数点前面和后面可以有数字,例如233.666;
当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
样例:
输入: “0”
输出: true
解法:模拟
纯粹考细节的题目
自己踩坑的测试用例:
- “.”
- “”
时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
bool isNumber(string s) {
bool e = false, num = false, dec = false, point = false, sign = false;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'e' || s[i] == 'E') {
e = true;
if (num == false && dec == false)
return false;
dec = false;
num = false;
point = false;
sign = false;
}
else if (s[i] >= '0' && s[i] <= '9') {
if (i > 0 && s[i - 1] == '.') {
num = false;
dec = true;
}
else num = true;
}
else if (s[i] == '.') {
if (point) return false;
else point = true;
}
else if (s[i] == '+' || s[i] == '-') {
if (sign) return false;
else if (i == 0 || s[i - 1] == 'E' || s[i - 1] == 'e')
sign = true;
else return false;
}
else return false;
}
if (e && num == false)
return false;
if (num == false && dec == false)
return false;
return true;
}
};