有效数字
07/03/2021
题目描述
给定一个字符串 s ,返回 s 是否是一个 有效数字。
例如,下面的都是有效数字:"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"。
一般的,一个 有效数字 可以用以下的规则之一定义:
一个 整数 后面跟着一个 可选指数。 一个 十进制数 后面跟着一个 可选指数。 一个 整数 定义为一个 可选符号 '-' 或 '+' 后面跟着 数字。
一个 十进制数 定义为一个 可选符号 '-' 或 '+' 后面跟着下述规则:
数字 后跟着一个 小数点 .。 数字 后跟着一个 小数点 . 再跟着 数位。 一个 小数点 . 后跟着 数位。 指数 定义为指数符号 'e' 或 'E',后面跟着一个 整数。
数字 定义为一个或多个数位。
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
提示:
- 1 <= s.length <= 20
- s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,或者点 '.' 。
本人题解
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
if (s.includes('fin')) return false
let result = parseFloat(s) == Number(s)
// console.log(result)
return result
};2025.3.14 提交了五次错误的 =。=
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
let pe
if (s.includes('e')) {
pe = s.split('e')
} else if (s.includes('E')) {
pe = s.split('E')
} else {
pe = [s]
}
if (pe.length > 2) {
return false
} else if (pe.length === 1 && !pe[0]) {
return false
} else if (pe.length === 2) {
if (!pe[0] || !pe[1]) {
return false
}
}
let p1Flag = false, // 小数点
p1FlagR = false, // 小数点后有数字
p2FlagR = pe.length === 2 ? false : true; // e后有数字
const p1Arr = pe[0].split('')
const p2Arr = (pe[1] || '').split('');
for (let i = 0; i < p1Arr.length; i++) {
const d = p1Arr[i];
if ((d === '+' || d === '-') && i === 0) {
continue
}
if ((d === '+' || d === '-') && i !== 0) {
return false
}
if (d === '.') {
if (p1Flag) {
return false
}
p1Flag = true
continue;
}
if (d >= '0' && d <= '9') {
p1FlagR = true
continue
}
return false
}
for (let i = 0; i < p2Arr.length; i++) {
const d = p2Arr[i];
if ((d === '+' || d === '-') && i === 0) {
continue
}
if ((d === '+' || d === '-') && i !== 0) {
return false
}
if (d >= '0' && d <= '9') {
p2FlagR = true
continue
}
return false
}
return p1FlagR && p2FlagR
};分析
忘了。以后再补