您的位置:首页 > 其它

Valid Number(leetcode)

2014-11-29 11:45 127 查看
题目:

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/

解题思路:细节题,要把所有的例外的情况排除

参考:/article/4999853.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: