题目:
难度:Hard
相关话题:数学
、字符串
验证给定的字符串是否可以解释为十进制数字。
例如:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
" -90e3 "
=> true
" 1e"
=> false
"e3"
=> false
" 6e-1"
=> true
" 99e2.5"
=> false
"53.5e93"
=> true
" --6 "
=> false
"-+3"
=> false
"95a54e53"
=> false
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
数字 0-9
指数 - “e”
正/负号 - “+”/”-“
小数点 - “.”
当然,在输入中,这些字符的上下文也很重要。
更新于 2015-02-10: C++
函数的形式已经更新了。如果你仍然看见你的函数接收 const char *
类型的参数,请点击重载按钮重置你的代码。
思路:
这道题涉及的情况很多,先理顺各种情况先后关系,针对s[i]
的每一种情况,写下来,然后再写代码,会清晰很多。
s[i]
空 如果前面什么都没有,继续;
否则后面就不能有任何除了"空"以外的
Num 前面如果有"e",则后面不能有"+-"
e 前面必须有"Num"
前面不能有"e"
后面必须有"Num"
+- 如果前面有"Num",前面一定要有"e"
如果前面有"." 前面一定要有"Num",有"e"
如果前面有"+-",前面一定有"Num",有"e"
如果前面有"e",前面一定要有"Num"
. 前面不能有"."
前面不能有"e"
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
let needNum=false,nothing=true,noAnything=false,noSign=false
let hasNum=false,hasPoint=false,hasState=false,hasE=false
for(let i=0;i<s.length;i++){
if(s[i]===" "){
if(nothing)continue
noAnything=true
continue
}else if(noAnything){
return false
}else if(s[i]==="+" || s[i]==="-"){
if(noSign)return false
if(hasNum && !hasE) return false
if(hasPoint && (!hasNum || !hasE))return false
if(hasState && (!hasNum || !hasE))return false
if(hasE && !hasNum)return false
hasState=true
}else if(/\d/.test(s[i])){
if(needNum)needNum=false
if(hasE)noSign=true
hasNum=true
}else if(s[i]==="e"){
if(!hasNum)return false
if(hasE)return false
hasE=true
needNum=true
}else if(s[i]==="."){
if(hasPoint)return false
if(hasE)return false
hasPoint=true
}else{
return false
}
nothing=false
}
return !needNum && !nothing && hasNum
};
扩展阅读: