自己做题的笔记,并不是最优解。如果有更好的思路欢迎大家告诉我,一起进步!
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+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;
}