11、表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
思路:
其实就是模拟题,分情况讨论,判断所有的边界情况就行了。
图解:
代码:
class Solution {
public:
bool isNumber(string s) {
int i = 0, j = s.size() - 1;
while(i <= j && s[i] == ' ') i++;
while(j >= 0 && s[j] == ' ') j--;
if(i > j) return false;
s = s.substr(i, j - i + 1); //去掉空格后的字符串
//忽略正负号
if(s[0] == '-' || s[0] == '+') s = s.substr(1);
//去掉空格,去掉正负号后,没有数字了,说明不合法
if(s.empty() || (s[0] == '.' && s.size() == 1)) return false;
if(s[0] == 'e' || s[0] == 'E') return false; //判掉e开头
int dot = 0, e = 0;
for(int i = 0 ; i < s.size(); i ++ ) {
if(s[i] >= '0' && s[i] <= '9') ;
else if(s[i] == '.') {
dot ++;
if(e || dot > 1) return false; //两个小数点,或者小数点在e后面出现
if(dot && i + 1 > s.size()) return false; //判掉小数点后面没有数字
}
else if(s[i] == 'e' || s[i] == 'E') {
e ++;
//e后面没有数字,两个e
if(i + 1 == s.size() ||e > 1) return false;
if(i == 1 && s[0] == '.') return false; //判掉.e
if (s[i + 1] == '+' || s[i + 1] == '-') //判断后面得+-号,并且判断后面是否有数字
{
if (i + 2 == s.size()) return false;
i ++ ;
}
}
else return false;
}
return true;
}
};