您的位置:首页 > 其它

[leetcode] Valid Number

2014-07-12 14:27 162 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: