Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
分析:此题的确很难,难点在于需要考虑的情况太多,列举如下:
1、空格不能出现在数字之间
2、点和e最多只能出现一次
3、出现e之前必须有数字
4、正负号要么出现在数字的最前面,要么出现在紧接着e后面
5、e后面必须还得有数字
6、正负号最多出现两次
class Solution {
public:
bool isNumber(const char *s) {
int len = (int)strlen(s);
int left = 0;
int right = len - 1;
while(' ' == s[left]) ++left;
while(' ' == s[right]) --right;
for(int i = 0; i < len; ++i)
{
if('e' == s[i])
return isNumber(s, left, i-1) && isInteger(s, i+1, right);
}
return isNumber(s, left, right);
}
bool isNumber(const char* s, int start, int end)
{
if(start <= end)
{
int cur = start;
bool hasDot = false;
bool hasDigit = false;
if('+' == s[cur] || '-' == s[cur])
++cur;
for(int i = cur; i <= end; ++i)
{
char ch = s[i];
if(ch >= '0' && ch <= '9')
{
hasDigit = true;
continue;
}
if('.' == ch && !hasDot)
hasDot = true;
else
return false;
}
return hasDigit;
}
return false;
}
bool isInteger(const char* s, int start, int end)
{
if(start <= end)
{
bool hasDigit = false;
if('+' == s[start] || '-' == s[start])
++start;
for(int i = start; i <= end; ++i)
if(s[i] >= '0' && s[i] <= '9')
hasDigit = true;
else
return false;
return hasDigit;
}
return false;
}
};