Valid Number 题解
题目来源: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.
解题思路:
粗暴方法
自己写的代码丑陋无比,一种情况一种情况试, 实在是无参考价值。 主要是各种情况,例如:
input
result
.123
true
12.
True
47e+6
True
__1.__
True
.
False
46.e3
OJ里的 .2e81 true 0.e false 46.e3 true
+3
True
-.3
True
6e6.5
false
bool isNumber(const char *s)
{
if(s == NULL) return false;
if(*s == '\0') return false;
while(*s == ' ')
s++; //skip 空格
if(*s == '\0') return false;
if(*s == '-' || *s == '+') s++;
bool firstnumber = false;
if((*s >= '0' && *s <= '9') || *s == '.')
firstnumber = true;
if(! firstnumber) return false;
bool has_e_before = false;
bool has_dot_before = *s == '.';
if(has_dot_before)
{
s++;
if (!(*s >= '0' && *s <= '9')) return false; // "."
}
while(*s != '\0')
{
if(*s >= '0' && *s <= '9')
{
s++;
}else if(*s == 'e')
{
if(has_e_before) return false;//.2e81 true //0.e false //46.e3 true
has_e_before = true;
s++;
if(*s == '+' || *s == '-') s++; //005047e+6 ok
if (!(*s >= '0' && *s <= '9')) return false; //"e." "e 1"
}else if(*s == ' ')
{
while(*s != '\0' && *s == ' ')
s++;
if(*s == '\0')//" 1.2 "
return true;
return false; //" 2.3 3"
}else if(*s == '.')
{
if(has_dot_before || has_e_before) return false;
has_dot_before = true;
s++;
}else
{
return false;
}
}
return true;
}整理下上面的代码,可以更好看些。
利用strtod.
利用函数strtod.
能够一步一步提取str中能够组成的double, str_end为提取后剩下的串。这里找了一份实现, 有兴趣的可以参考下 strtod的源码.
利用自动机
可参考 自动机实现valid-number.
Last updated
Was this helpful?