您的位置:首页 > 其它

[LeetCode]—Valid Number 判断字符串是否为合法数据(科学计数法)

2014-07-04 13:29 453 查看
Valid Number

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.
该题目测试数据集特别丰富。

主要注意以下明显情况:

1、前后出现空白。

2、2e或者2E,E后面未接其他数字是false的

3、小数点出现的位置。(只能在e前)

4、e前面要有数据出现 ".E"或“.”是不对的

很经典的一个划分,就是以E为界限,划分为前后2部分 firstPart 和secondPart 来讨论各种情况。

最后:根据数据集慢慢测试调整。

学习下文后,得出代码:http://www.cnblogs.com/remlostime/archive/2012/11/18/2775938.html

class Solution {
public:
bool isNumber(const char *s) {
assert(s);
int n=strlen(s);
const char *end;
end= s+n-1;

bool dotAppear=false;
bool eAppear=false;
bool firstPart=false;  //以E为分界线
bool secondPart=false;

while(isspace(*s))s++;
while(isspace(*end))end--;

if(*s=='+'|| *s=='-')s++;

while(s!=(end+1)){
if(isdigit(*s)){
if(!eAppear)
firstPart=true;
else
secondPart=true;
}
else if(*s=='.'){
if(dotAppear ||eAppear || secondPart)
return false;
else
dotAppear=true;
}
else if(*s=='e' || *s=='E'){
if(eAppear)
return false;
else
eAppear=true;

}
else if(isspace(*s))
{
return false;
}
else if(*s=='+' || *s=='-'){
if(*(s-1)=='e' || *(s-1)=='E')
;
else
return false;
}
else{
return false;
}

s++;
}

if(!firstPart)return false;
else if(eAppear && !secondPart)
return false;
return true;

}
};


还有一种方法:判断是否为数字,类似于函数strtod()
函数名: strtod

功 能: 将字符串转换为double型值

用 法: double strtod(char *str, char **endptr);

函数说明:strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('\0')才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。

// @author 连城(http://weibo.com/lianchengzju)
/*调用strtod()*/
class Solution{
public:
bool isNumber(const char *s){
char *endptr;

strtod(s,&endptr);

if(endptr==s)return false;   //数字就不存在 例如:s="   "

for(;*endptr!='\0';++endptr)
if(!isspace(*endptr))return false;  //如果剩余的不是空格,就表示出错。

return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: