原文:65. 有效数字(力扣 面试题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-065/

题目:

难度: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
};

扩展阅读: