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.
这个题目很纠结@很多难以想到的构造竟然是对的。难度不小@此题最好边试边发现一些bug!再改!
注意:
1、前面空格,后空格,中间空格
2、加减号(e后面也能出现)
3、e,E 出现的处理
4、点号,能出现的位置。(e 后面不能出现!)
思路:
1、先处理前半部分空格
2、再处理符号(+,-)
3、之后边检查是否中间有空格,过滤末尾空格
4、是否是数,如果是数part为真方便后面处理!
5、对于e或者E的结合,只能出现一次,且在前面为数字的情况才能进行,part设为假。(如果后面有符号就处理掉,即向前走一步)
6、对于点号。首先是判断是否出现过.或e,没有的话继续。
bool isNumber(const char *s) {
//".e1"错误,40.e3正确,8e错误
bool store_eflag = false;
bool store_dotflag = false;
bool num_flag = false;
bool space_flag = false;
bool part = false;//表示前面部分正确标志
while(*s != '\0'&&*s == ' ')//过滤前面的空格
{
s++;
}
if(*s == '+' || *s == '-')
{
s++;
}
while(*s != '\0')
{
if(*s == ' ')
{
space_flag = true;
}
else if(space_flag)//中间出现过空格
{
return false;
}
else if(*s == '.')
{
if(!store_dotflag &&!store_eflag )//未出现过.和e
{
store_dotflag = true;
}
else
return false;
}
else if(isdigit(*s))
{
part = true;
num_flag = true;
}
else if(*s == 'e'||*s == 'E')
{
if(store_eflag != true&&part == true)
{
if(*(s+1) == '-'||*(s+1) == '+')
{
s++;
}
store_eflag = true;
part = false;//此处设为假判断后续是否会来数字!
}
else return false;
}
else
{
return false;
}
s++;
}
return part;
}
下面是本人测试的错误!
Input: "+.8" 所以 .8 也是对的!Output: false
Expected: true
8e 错误
8e2 对
Input: "e9"
Output: true
Expected: false
第二次:
对于数字,必须出现,否则怎么能叫数字呢?!part_flag 用于表示只是一部分,还需数字。
对于开始-- 处理空格,处理+-号。
再者中间空格,此处的中间空格处理很巧妙!!
对于逗号,保证出现前,必须未出现e,且第一次出现。
对于e,比较复杂,保证第一次出现,且出现时保证前面有数字
其他为假!
bool isNumber(const char *s)
{
bool dot_flag = false;
bool e_exit = false;
bool part_flag = true;
bool space_flag = false;
while(*s == ' ')
{
part_flag = true;
++s;
}
if(*s == '+'||*s == '-')
{
part_flag = true;
++s;
}
while(*s != '\0')
{
if(*s == ' ')
{
space_flag = true;
++s;
}
else if(space_flag)//中间空格!!
{
return false;
}
else if(*s == '.' && !dot_flag)//点号出现必须未出现,且在e之前,
{
if(!e_exit)//未出现过e
{
dot_flag = true;
++s;
}
else
{
return false;
}
}
else if((*s == 'e'||*s == 'E') && !e_exit &&(!part_flag))//e 未出现,而且还需确保后面有数字,以及处理正负号(e9 也不行)
{
++s;
if(*s == '+'||*s == '-')
{
++s;
}
part_flag = true;//必须有数字出现才完整
e_exit = true;
}
else if(*s >= '0' && *s <= '9' )
{
part_flag = false;//必须有数字
++s;
}
else
{
return false;
}
}
return !part_flag;
}