Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
检测一段字符串是不是一个数字,这里的数字包括很多种情况,首先去除字符串首和串尾的连续空格
1. 小数 :
".5" // 相当于0.5 true
"3."// 相当于3.0 true
"." // false
".." //false
"5.6.7" //false
2. 指数 :
".5e+13"// true
".5e+"//false
".5e6e"//false
"0.25e0.3"//false e前面可以是小数,e后面必须是整数
"15e" //false e后面得有数才行哪怕是0000....
综上可以总结出一套O(N) 复杂度的程序,就是判断的情况要多一些
class Solution {
public:
bool isNumber(string s) {
int head = 0, tail, size = s.size();
while (head<size&&s[head] == ' ') head++;
s = s.substr(head); size = s.size();
tail = s.size() - 1;
while (tail>=0&&s[tail] == ' ') tail--;
s = s.substr(0, tail+1);
if (!s.empty())
{
if (s[0] == '-' || s[0] == '+') s = s.substr(1);
return isok(s, 0, 0, -1);
}
return 0;
}
bool isok(string s, int i, int dot, int e)
{
if (s[i] >= '0' && s[i] <= '9')
{
if (e == -1) e = 0;
return i == s.size() - 1 ? true : isok(s, i + 1, dot, e);
}
else if (s[i] == '.')
{
if (dot == 0 && ((e == 0) || (e == -1)))
return i == s.size() - 1 ? i!=0 : isok(s, i + 1, 1, e);
else return false;
}
else if (s[i] == 'e')
{
if (e == 0)
{
if (i == s.size() - 1) return false;
if (s[i + 1] == '+' || s[i + 1] == '-')
{
if (i == s.size() - 2) return false;
return isok(s, i + 2, dot, 1);
}
return isok(s, i + 1, dot, 1);
}
else return false;
}
return false;
}
};