1、题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"
都表示数值。
但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"
都不是。
注意:
1.小数可以没有整数部分,例如.123等于0.123;
2.小数点后面可以没有数字,例如233.等于233.0;
3.小数点前面和后面可以有数字,例如233.666;
4.当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
5.当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
样例:
输入: "0"
输出: true
2、问题描述:
判断一个字符串是否表示的数字。这一个题主要是列举除所有的情况就可以了。
3、问题关键:
1.第一步,去掉行首和行尾的空格。
2.如果行首有一个正负号,那么直接忽略。
3.此时字符串为空或者后面只有一个 ‘.‘那么就返回false。
4.遍历字符串。如果数字直接忽略。
5.‘.'只能出现在‘e’的前面,且’.'和‘e’只能出现1次,否则不合法。
6.e后面为空,e前面为空,e多于一次,e前面只有一个‘.‘,都不合法。
7.e后面为正负号,但后面为空。
8.其他字符,false;
4、C++代码:
class Solution {
public:
bool isNumber(string s) {
int i = 0;
while(i < s.size() && s[i] == ' ') i ++; //去掉行首的空格。
int j = s.size() - 1;
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;//如果为空或者只有一个'.'不合法。
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'后面出现或者dot > 1不合法。
}
else if (s[i] == 'e' || s[i] == 'E') {
e ++;
if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.')
return false;//e后面为空;e前面为空;e多于1个;e前面只有一个'.'
if (s[i + 1] == '+' || s[i + 1] == '-') {
if (i + 2 == s.size()) return false;//e后面跟着正负号,后面为空。
i ++;
}
}
else return false;
}
return true;
}
};