Valid Number(leetcode)

题目:

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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值