LeetCode 65

    Valid Number

这个题意思是判断一个字符串是否是一个合法的数字,看起来简简单单的一个题,但是我认为若是在面试过程中去写这个题的话,我相信90%的人写不对,写的时候真让人很崩溃。测试用例对有些情况的解释又有些不合理,但是情况确实很多,下面我们首先来见见测试用例吧!

int main()
{
	Solution A;
	//string s1 = "";       //false
	//string s1 = "+123";   //true
	//string s1 = "-1";     //false
	//string s1 = "-1.0";   //true
	//string s1 = "2e2";    //true
	//string s1 = "aasd";   //false
	//string s1 = "123";    //true
	//string s1 = "2e2.2";  //false
	//string s1 = "2e2e";   //false
	//string s1 = "++1";    //false
	//string s1 = "+-1";    //false
	//string s1 = "+ 1 ";   //false
	//string s1 = ".";      //false
	//string s1 = "e";      //false
	//string s1 = "    ";   //false
	//string s1 = ".1";     //true,这个我个人感觉有争议
	//string s1 = "...";    //false
	//string s1 = "0e";     //false
	//string s1 = "0e1";    //true
	//string s1 = "1 4";    //false
	//string s1 = "1 .";    //false
	//string s1 = "3.";     //true,这个我也觉得有争议
	//string s1 = "9 E";    //false;
	//string s1 = "39E";    //false
	string s1="005047e+6"; //true
	
	if (A.isNumber(s1))
		cout << "Yes" << endl;
	else
		cout << "No" << endl;

	return 0;
}
大家看看上面的测试用例吧,后面有其是否合法,可以看到有些情况很容易忘掉,有些测试用例和我们的想象不一样,我的代码改了好多遍,最终通过了所有测试用例,但是有个警告说是不是最优的!下面我就给出代码,大家若是有比较健壮的代码,可以给我指导一下,欢迎大家给我提建议。

class Solution {
public:
	bool isNumber(string s)
	{
		if (s.size() == 0)
		{
			return false;
		}

		int len = s.size();
		int pos = 0;
		
		//去掉空格
		while (pos < len && s[pos] == ' ')
			++pos;

		//全空格
		if (pos == len)
		{
			return false;
		}

		//正负号
		if (s[pos] == '-' || s[pos] == '+')
		{
			++pos;
		}
		
		//正常情况
		bool noE = true;
		bool noPoint = true;
		bool noNum = true;
		bool noSpace = true;
		int lastPosNum = 0;
		while (pos < len)
		{
			if (!isNum(s[pos]))
			{ //不是数字
				if (s[pos] == ' ')
				{
					noSpace = false;
				}
				else if (s[pos] == '+' || s[pos] == '-')
				{ //但此时不可能为开头位置了
					if (s[pos - 1] != 'e' && s[pos - 1] != 'E')
						return false;					
				}
				else if (noE && noPoint && s[pos] == '.')
				{ //e之后不能有 . 例如:2e2.1

					//if (noNum) // . 之前必须有数字,如 "." ,但是提交时".1"应该是true
					//	return false;
					
					if (!noSpace)
					{
						return false;
					}

					noPoint = false;
					lastPosNum = pos;
				}
				else if (noE && (s[pos] == 'e' || s[pos] == 'E') )
				{
					if (noNum) //e之前没有数字,如 "e" 不合法
						return false;
					if (!noSpace)
						return false;

					noE = false;
					lastPosNum = pos;
				}
				else
				{
					return false;
				}
			}
			else
			{
				if (!noSpace)
				{
					return false;
				}

				noNum = false;
				lastPosNum = pos;
			}
			++pos;			
		}

		//若开头为0,除了0.XX等等为正确的,其他的都错
		if (noNum)
		{
			return false;
		}

		if (s[lastPosNum] == 'e' || s[lastPosNum] == 'E')
		{
			return false;
		}

		return true;
	}

	bool isNum(char ch)
	{
		return (ch >= '0' && ch <= '9');
	}	
};
首次遇到提交结果有警告!



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值