[leetcode]Valid Number

Valid Number

Difficualty:Hard

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.

这道题的通过率很低,只有12.7%,题目就是判断一个字符串是否是一个数值。

需要注意的几点是:

1、头尾有空格也算是正确的数值。

2、数值中除了数字,还可以出现的就只有+、-、e和.,并且e和.只能出现一次,并且以从左到右的顺序,.必须先于e出现。

3、+、-只能出现在数值的开头或者跟在e的后面,并且+、-的后紧跟的只能是数字或.。

4、e不能出现在头尾。

5、.的相邻的左右两边至少有一边是数字。

我的方法是先遍历一遍数值的每一位,记录每一位的类型,保存在另一个数组里,并且同时判断有多个e或者多个.的情况,然后再便利生成的数组,分析每一位是否符合要求。

bool isNumber(string s) {
	int start = 0;
	int end = s.size();

	for (int i = 0; i < s.size(); i++){//去掉头部空格
		if ((int)s[i] == 32)
			start++;
		else
			break;
	}
	for (int i = s.size()-1; i >=0; i--){//去掉尾部空格
		if ((int)s[i] == 32)
			end--;
		else
			break;
	}
	string str = s.substr(start, end - start);//去掉头尾空格后的字符串
	if (str.size() == 0)
		return false;

	bool haveDot = false;//是否有点
	bool haveE = false;//是否有e
	bool meetE = false;//用来判断.是不是出现在e后面

	vector<int> vail(str.size(), 0);//用来保存数值的每一位的类型 0是数字 1是. 2是e 3是+-

	for (int i = 0; i < str.size(); i++){
		int c = (int)str.at(i);
		if (c >= 48 && c <= 57)//数字
			continue;
		else if(c==46){//.
			vail[i] = 1;
			if (haveDot)
				return false;
			else
				haveDot = true;
		}
		else if (c==101){//e
			vail[i] = 2;
			if (haveE)
				return false;
			else
				haveE = true;
		}
		else if (c==43||c==45){//+-
			vail[i] = 3;
		}
		else//其他字符
		   return false;
	}

	for (int i = 0; i < vail.size(); i++){
		if (vail[i]==2){//e
			meetE = true;
			if (i == 0 || i == (vail.size() - 1))//e出现在头尾
				return false;
		}
		else if (vail[i] == 1){//.
			if (meetE)//.出现在e之后
				return false;

			if (i == (vail.size() - 1)){//.在尾部
				if (i - 1 >= 0){
					if (vail[i - 1] != 0)
						return  false;
				}
				else
					return  false;
			}
			else if (i == 0){//.在头部
				if (i + 1 < vail.size()){
					if (vail[i + 1] != 0)
						return  false;
				}
				else
					return  false;
			}
		}
		else if (vail[i] == 3){//+-
			if (i == vail.size() - 1)//+-在尾部
				return false;
			if (i != 0){//+-不在头部
				if (vail[i - 1] != 2 || (vail[i + 1] != 0 && vail[i + 1] != 1))//此时+-左边只能是e 右边只能是数字或.
					return false;
			}
			else{//+-在头部
				if (vail[i + 1] != 0 && vail[i + 1] != 1)//此时+-右边只能是数字或.
					return false;
			}
		}
	}
	return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值