leetcode 65题

Posted by franki on June 28, 2021

leetcode 65题 有效数字

有效数字(按顺序)可以分成以下几个部分:

一个 小数 或者 整数 (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数 小数(按顺序)可以分成以下几个部分:

(可选)一个符号字符(’+’ 或 ‘-‘) 下述格式之一: 至少一位数字,后面跟着一个点 ‘.’ 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字 一个点 ‘.’ ,后面跟着至少一位数字 整数(按顺序)可以分成以下几个部分:

(可选)一个符号字符(’+’ 或 ‘-‘) 至少一位数字

部分有效数字列举如下:

[“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”] 部分无效数字列举如下:

[“abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53”] 给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

示例1

输入:s = "0"
输出:true

示例2

输入:s = "e"
输出:false

思路

遵循以下规则:

数字: 0 < x < 9

点号:之前没有出现点号并没有出现e

e或者E: 之前没有出现e并且出现了数字

+或者-: 第一位或者前面是e

代码

/**
 * @param {string} s
 * @return {boolean}
 */
function isNumber(s) {
  let numFlag = false, dotFlag = false, eFlag = false;
  for (let i=0; i<s.length; i++) {
    if ('0' <= s[i] && s[i] <= '9') {
      numFlag = true;
    } else if (s[i] === '.' && !dotFlag && !eFlag) {
      dotFlag = true;
    } else if ((s[i] === 'e' || s[i] === 'E') && !eFlag && numFlag) {
      eFlag = true;
      numFlag = false;
    } else if ((s[i] === '+' || s[i] === '-') && (i === 0 || s[i-1] === 'e' || s[i-1] === 'E')) {
      continue;
    } else {
      return false;
    }
  }
  return numFlag;
}

复杂度分析:

  • 时间复杂度: O(N)
  • 空间复杂度:O(1)