leetcode 65. Valid Number

本文介绍了一种判断给定字符串是否能表示一个有效数值的方法。包括整数、小数、科学计数法等多种情况,并通过具体代码实现进行详细说明。

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.

这题虽没啥难的但要考虑的情况太多,太琐碎,所以提交了很多次,最后几乎是提交一次按错误的情况修改代码,简直要崩溃。所以建议事先收集好所有信息,在vs编辑器里定义一个数字,然后看是不是valid,这样可以避免很多错误提交。

最后写代码要耐心。


bool isNumber(char* s) {
	//double c = 5e-5;
	//int p = +-+-0.;
	//double c = 3.e1;
	//double cc = -+-+1.3e4;
	//double v = 1.4+1e2;
	if (s == NULL)
		return false;
	int len = strlen(s);
	if (s[0] != '.'&&s[0] != ' '&&s[0] != '+'
		&&s[0] != '-' && !(s[0] - '0' >= 0 && s[0] - '9' <= 0))
		return false;
	int k = 0;
	while (k < len&&s[k] == ' ')
		k++;
	if (k == len)
		return false;
	int jj=k;
	if (s[k] == '+' || s[k] == '-')
	{
		jj = k;
		while (jj < len&&s[jj] == '+' || s[jj] == '-')
			jj++;
		if (jj == len)
			return false;
		for (int i = k; i < jj - 1; i++)
			if (s[i] == s[i + 1])
				return false;
		k = jj;
	}
	int uu = len - 1;
	while (uu >= 0 && s[uu] == ' ')
		uu--;
	for (int iii = k; iii <= uu; iii++)
		if (s[iii] == ' ')
			return false;
	int dotpos = -1;
	if (s[k] == '.')
	{
		int yy = k + 1;
		while (yy < len&&s[yy] == ' ')
			yy++;
		if (yy == len)
			return false;
		dotpos = k;
		for (int i = k + 1; i < len; i++)
			if (s[i] == '.')
				return false;
	}
	else
	{
		for (int i = k + 1; i < len; i++)
			if (s[i] == '.')
			{
				if (dotpos >= 0)
					return false;
				dotpos = i;
			}
	}
	if (dotpos >= 0)
	{
		if (dotpos == len - 1)
		{
			if (!(len-2>=0&&(s[len-2] - '0' >= 0 && s[len-2] - '9' <= 0)))
				return false;
			for (int i = jj; i < len - 1; i++)
				if (s[i] == 'e'||s[i]=='+'||s[i]=='-')
					return false;
			return true;
		}
		for (int i = k; i < dotpos; i++)
			if (!(s[i] - '0' >= 0 && s[i] - '9' <= 0))
				return false;
		int ii;
		for (ii = dotpos + 1; ii < len; ii++)
			if (s[ii] != ' ')
				break;
		if (ii == len)
			return true;
		k = dotpos + 1;
	}
	if (k == len)
		return false;
	if (!(s[k] - '0' >= 0 && s[k] - '9' <= 0||s[k]=='e'))
		return false;
	while (k < len && (s[k] - '0' >= 0 && s[k] - '9' <= 0))
		k++;
	if (k == len)
		return true;
	int j;
	for (j = k; j < len; j++)
		if (s[j] != ' ')
			break;
	if (j == len)
		return true;
	if (s[k] != 'e')
		return false;
	if (k - 1 >= 0 && s[k - 1] == '.')
	{
		if (!(k - 2 >= 0 && s[k - 2] - '0' >= 0 && s[k - 2] - '0' <= 9))
			return false;
	}
	bool fl = false;
	for (int i = 0; i < k; i++)
		if (s[i] - '0' >= 0 && s[i] - '0' <= 9)
		{
			fl = true;
			break;
		}
	if (!fl)
		return false;
	if (k == len - 1)
		return false;
	k++;
	if (s[k] == '+' || s[k] == '-')
		k++;
	if (k == len)
		return false;
	if (!(s[k] - '0' >= 0 && s[k] - '9' <= 0))
		return false;
	int i;
	for (i = k; i < len; i++)
		if (!(s[i] - '0' >= 0 && s[i] - '9' <= 0))
			break;
	if (i == len)
		return true;
	for (; i < len; i++)
		if (s[i] != ' ')
			return false;
	return true;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值