您的位置:首页 > 编程语言 > C语言/C++

[LeetCode] Valid Number

2014-06-24 11:57 295 查看
Validate if a given string is numeric.

Some examples:
"0"
 => 
true

" 0.1 "
 => 
true

"abc"
 => 
false

"1 a"
 => 
false

"2e10"
 => 
true


Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

这道题着实费了不少代码,而且写出来的貌似也不是很好看,这道题AC率10.8%,挺低的了。

1.截取字符串从第一个非空格到倒数第一个非空格的字符串段

2.考虑长度若只为1的情况下的各种情况,“.”,"+","-“均不合理,但是确实可以以这些为开头

3.e是一个很关键的东西,在e之前和在e之后都必须包含有数字,容易忽视的是e后面允许存在一个"+""-"符号!

4.e和小数点都只能有1个,这是比较浅显的了

这道题关键在于题设的不确定性,需要多次修改完备程序,不能纯粹臆想。

class Solution {
public:
bool isNumber(const char *s) {
bool pointflag = false;
bool eflag = false;
bool numflag = false;
bool enumflag = false;
bool symbolflag = false;

int startpos = 0;
int endpos = 0;
int length = strlen(s);
int i = 0;
while ( *(s + i) )
{
if (i >= length)
{
return false;
}
if ( *(s + i) != ' ')
{
startpos = i;
break;
}
i++;
}
i = length - 1;
while ( *(s + i))
{
if (i < 0)
{
return false;
}
if ( *(s + i) != ' ')
{
endpos = i;
break;
}
i--;
}

if (endpos < startpos)
return false;
length = endpos - startpos + 1;

if ( !(s[startpos] >= '0' && s[startpos] <= '9' || s[startpos] == '.' || s[startpos] == '+' || s[startpos] == '-'))
return false;
if (length == 1)
{
if (s[startpos] != '.')
return true;
else if (s[startpos] == '+' || s[startpos] == '-')
return false;
else
return false;
}

if (s[startpos] == '+' || s[startpos] == '-')
{
startpos++;
}

for (int i=startpos; i<=endpos; i++)
{
//a num can not have more than one point
if (s[i] == '.' && pointflag == false)
{
pointflag = true;
continue;
}
if (s[i] == '.' && pointflag == true)
return false;

//if already have a 'e',the rest part should not have any point
//and e should not have more than one
if (s[i] == 'e' && eflag == false && i != endpos && numflag == true)
{
pointflag = true;
eflag = true;
if (s[i+1] == '+' || s[i+1] == '-')
{
i++;
}
continue;
}
if (s[i] == 'e' && eflag == false && (i == endpos || numflag == false))
{
return false;
}
if (s[i] == 'e' && eflag == true)
return false;

//normal condition
if ( !(s[i] >= '0' && s[i] <= '9'))
return false;
else if (s[i] >= '0' && s[i] <= '9' && eflag == false)
numflag = true;
else if (s[i] >= '0' && s[i] <= '9' && eflag == true)
enumflag = true;
}

if (eflag == false)
{
if (numflag == true)
return true;
}
else
{
if (enumflag == true && numflag == true)
return true;
}
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ leetcode