题目:
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.
题目来源:https://oj.leetcode.com/problems/valid-number/
解题思路:细节题,要把所有的例外的情况排除
参考:http://www.cnblogs.com/easonliu/p/3699525.html
注意事项:
1. 前后空格
2."+","-"号
3. "e"和"E"的出现位置
4."."小数点的出现位置
5. "1.",".34","+.1"也被认为是正确的
6."012"认为是正确的,即前导0没关系
《leetcode题解》中的解法仍然没有看懂,是用有限状态自动机来做的,但是看起来更简练,有时间了这个代码还是很值得研究一下的,有利于以后解这种问题,有限状态机是个很有用的工具。
#include<iostream>
using namespace std;
bool isNumber(const char *s)
{
while(*s==' ')
++s;
if(*s=='+' || *s=='-')
++s;
if(*s=='\0')
return false;
bool dot=false,exp=false,sign=false,digit=false,space=false;
while(*s!='\0')
{
switch(*s)
{
case '.':
if(dot==true || (!isdigit(*(s+1)) && digit==false) ||space==true ||exp==true)
return false;
else
dot=true;
break;
case 'e':case'E':
if(exp==true || digit==false)
return false;
else
{
exp=true;
if(*(s+1)=='+' || *(s+1)=='-')
++s;
if(!isdigit(*(s+1)))
return false;
}
break;
case ' ':
space=true;
break;
default:
if(isdigit(*s))
{
if(space==true)
return false;
else
digit=true;
}
else
return false;
break;
}
++s;
}
return true;
}
int main()
{
string s=" 3e3 ";
cout<<isNumber(s.c_str())<<endl;
system("pause");
return 0;
}