Valid Number
这个题意思是判断一个字符串是否是一个合法的数字,看起来简简单单的一个题,但是我认为若是在面试过程中去写这个题的话,我相信90%的人写不对,写的时候真让人很崩溃。测试用例对有些情况的解释又有些不合理,但是情况确实很多,下面我们首先来见见测试用例吧!
int main()
{
Solution A;
//string s1 = ""; //false
//string s1 = "+123"; //true
//string s1 = "-1"; //false
//string s1 = "-1.0"; //true
//string s1 = "2e2"; //true
//string s1 = "aasd"; //false
//string s1 = "123"; //true
//string s1 = "2e2.2"; //false
//string s1 = "2e2e"; //false
//string s1 = "++1"; //false
//string s1 = "+-1"; //false
//string s1 = "+ 1 "; //false
//string s1 = "."; //false
//string s1 = "e"; //false
//string s1 = " "; //false
//string s1 = ".1"; //true,这个我个人感觉有争议
//string s1 = "..."; //false
//string s1 = "0e"; //false
//string s1 = "0e1"; //true
//string s1 = "1 4"; //false
//string s1 = "1 ."; //false
//string s1 = "3."; //true,这个我也觉得有争议
//string s1 = "9 E"; //false;
//string s1 = "39E"; //false
string s1="005047e+6"; //true
if (A.isNumber(s1))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
大家看看上面的测试用例吧,后面有其是否合法,可以看到有些情况很容易忘掉,有些测试用例和我们的想象不一样,我的代码改了好多遍,最终通过了所有测试用例,但是有个警告说是不是最优的!下面我就给出代码,大家若是有比较健壮的代码,可以给我指导一下,欢迎大家给我提建议。
class Solution {
public:
bool isNumber(string s)
{
if (s.size() == 0)
{
return false;
}
int len = s.size();
int pos = 0;
//去掉空格
while (pos < len && s[pos] == ' ')
++pos;
//全空格
if (pos == len)
{
return false;
}
//正负号
if (s[pos] == '-' || s[pos] == '+')
{
++pos;
}
//正常情况
bool noE = true;
bool noPoint = true;
bool noNum = true;
bool noSpace = true;
int lastPosNum = 0;
while (pos < len)
{
if (!isNum(s[pos]))
{ //不是数字
if (s[pos] == ' ')
{
noSpace = false;
}
else if (s[pos] == '+' || s[pos] == '-')
{ //但此时不可能为开头位置了
if (s[pos - 1] != 'e' && s[pos - 1] != 'E')
return false;
}
else if (noE && noPoint && s[pos] == '.')
{ //e之后不能有 . 例如:2e2.1
//if (noNum) // . 之前必须有数字,如 "." ,但是提交时".1"应该是true
// return false;
if (!noSpace)
{
return false;
}
noPoint = false;
lastPosNum = pos;
}
else if (noE && (s[pos] == 'e' || s[pos] == 'E') )
{
if (noNum) //e之前没有数字,如 "e" 不合法
return false;
if (!noSpace)
return false;
noE = false;
lastPosNum = pos;
}
else
{
return false;
}
}
else
{
if (!noSpace)
{
return false;
}
noNum = false;
lastPosNum = pos;
}
++pos;
}
//若开头为0,除了0.XX等等为正确的,其他的都错
if (noNum)
{
return false;
}
if (s[lastPosNum] == 'e' || s[lastPosNum] == 'E')
{
return false;
}
return true;
}
bool isNum(char ch)
{
return (ch >= '0' && ch <= '9');
}
};
首次遇到提交结果有警告!