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)