leetcode 随笔 Valid Number

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

检测一段字符串是不是一个数字,这里的数字包括很多种情况,首先去除字符串首和串尾的连续空格

1. 小数 :

".5" // 相当于0.5 true

"3."// 相当于3.0 true

"." // false

".." //false

"5.6.7" //false

2. 指数 :

".5e+13"// true

".5e+"//false

".5e6e"//false

"0.25e0.3"//false e前面可以是小数,e后面必须是整数

"15e" //false e后面得有数才行哪怕是0000....


综上可以总结出一套O(N) 复杂度的程序,就是判断的情况要多一些

class Solution {
public:
	bool isNumber(string s) {
		int head = 0, tail, size = s.size();
		while (head<size&&s[head] == ' ') head++;
		s = s.substr(head); size = s.size();
		tail = s.size() - 1;
		while (tail>=0&&s[tail] == ' ') tail--;
		s = s.substr(0, tail+1);
		if (!s.empty())
		{
			if (s[0] == '-' || s[0] == '+') s = s.substr(1);
			return isok(s, 0, 0, -1);
		}
		return 0;
	}
	bool isok(string s, int i, int dot, int e)
	{
		if (s[i] >= '0' && s[i] <= '9')
		{	
			if (e == -1) e = 0;
			return i == s.size() - 1 ? true : isok(s, i + 1, dot, e);
		}
		else if (s[i] == '.')
		{
		    if (dot == 0 && ((e == 0) || (e == -1)))
				return i == s.size() - 1 ? i!=0 : isok(s, i + 1, 1, e);
			else return false;
		}
		else if (s[i] == 'e')
		{
			if (e == 0)
			{
				if (i == s.size() - 1) return false;
				if (s[i + 1] == '+' || s[i + 1] == '-')
				{
					if (i == s.size() - 2) return false;
					return isok(s, i + 2, dot, 1);
				}
				return isok(s, i + 1, dot, 1);
			}
			else return false;
		}
		return false;
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值