剑指offer-[表示数值的字符串]-JavaScript实现

自己做题的笔记,并不是最优解。如果有更好的思路欢迎大家告诉我,一起进步!

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

思路分析

一个数值的组成有:符号(+ -),数字,点(.),指数位(E e)。
若字符串中出现了这四部分之外的字符,则返回flase。
一个数值遵循以下几个规律:
(1)符号只能出现在第一位或E指数后的第一位
(2)一个数值里不能出现多个点。E指数后面也不能带小数点
(3)E指数只能出现一次,且E指数前面必须有数字,E指数后面也必须有数字。(即E指数不能为最后一位)
我们设定四个Count值来记录这几个部分的出现次数。则对字符串进行遍历。
若碰到符号,则判断symCount是否为0(即只出现一次),numCount是否为0(即出现在第一位)。若都满足条件,则使symCount++。
若碰到数字,numCount++即可。
若碰到点,则判断dotCount是否为0(即只出现一次),eCount是否为0(即指数后面不能为小数)。若都满足条件,则使dotCount++,并且将numCount重置为0。
若碰到指数,则判断eCount是否为0(即只出现一次),numCount是否为0(即指数前面必须有数值)。若都满足条件,则使eCount++,并且将symCount重置为0(即指数后面可以立即接±号),numCount重置为0(为了判断指数后的符号是否为第一位)。
还有一点最重要的不能忘记,E指数不能在最后一位,不要漏了这个条件判断。

具体JS代码实现

//s字符串
function isNumeric(s)
{
    // write code here
    var numCount = 0;
	var dotCount = 0;
	var eCount = 0;
	var symCount = 0;
	var length = s.length;
	if(length == 0)
	{
		return false;
	}
	//记得先判断最后一个位置不能为E指数
	if(s[length-1]=="E" || s[length-1] == "e")
	{
		return false;
	}
	for(var i = 0; i < length; i++)
	{
		if(s[i]=="+" || s[i]=="-")
		{
			if(symCount == 0 && numCount == 0)
			{
				symCount++;
			}
			else
			{
				return false;
			}
		}
		else if(s[i]>="0" && s[i]<="9")
		{
			numCount++;
		}
		else if(s[i]==".")
		{
			if(dotCount != 0 || eCount !=0)
			{
				return false;
			}
			else
			{
				dotCount++;
				numCount = 0;
			}
		}
		else if(s[i]=="E"||s[i]=="e")
		{
			if(eCount!=0 || numCount ==0)
			{
				return false;
			}
			else
			{
				eCount++;
				numCount = 0;
				symCount = 0;
			}
		}
		else
		{
			return false;
		}
	}
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值