1. 题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
一些易错示例:
示例1:
输入:“e9”
输出:false
示例2:
输入:“1 ”
输出:true
解释:1后面有空格也没关系
示例3:
输入:“ ”
输出:false
示例4:
输入:“3.”
输出:true
示例5:
输入:“.”
输出:false
示例6:
输入:“+.8”
输出:true
示例7:
输入:“. 1”
输出:false
解释:.和1之间有空格
示例8:
输入:“.e1”
输出:false
解释:e之前必须有数字
示例9:
输入:“4e+”
输出:false
示例10:
输入:“-.”
输出:false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 题解
分析:本题考察代码的完整性,从执行结果看,虽然代码不是特别有效率,但是思路比较清晰,下面说几个判断规则:
(1)e,E 之前和之后必须有数字,之后不能有小数点;
(2)±号一定是出现在首位或者e,E之后的第一位;
(3)e,E 、±号、小数点都是唯一的,只能出现1次。
解题思路:
首先根据有没有 e,E 将字符串划分为 e,E之前 和 e,E之后,二者的区别在于e,E之后不能出现小数点;然后遍历判断子串,如果有±号一定是出现在首位的,接着是小数点的判断,然后是非数字的判断,出现非数字的字符直接返回false。
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
s = s.trim();
if(s.length === 0){
return false;
}
let e = null;
if(s.includes("e")){
e = "e";
}else if(s.includes("E")){
e = "E";
}
if(e != null){
let index = s.indexOf(e);
return tryParseNumber(s.substring(0, index), true) && tryParseNumber(s.substring(index+1, s.length), false);
}
return tryParseNumber(s, true);
};
function tryParseNumber(s, canHasDot){
if(s.length === 0){
return false;
}
let hasNumber = false;
let hasDot = false;
for(let i = 0 ; i < s.length; i++){
if(i === 0 && (s.charAt(i) == "+" || s.charAt(i) == "-")){
continue;
}else if(s.charAt(i) == "."){
if(!canHasDot || hasDot || s.length === 1){
return false;
}else{
hasDot = true;
continue;
}
}else if(!(s.charAt(i) >= "0" && s.charAt(i) <= "9")){
return false;
}else{
hasNumber = true;
}
}
return hasNumber;
}
执行用时:132 ms, 在所有 JavaScript 提交中击败了20.50%的用户;
内存消耗:40.7 MB, 在所有 JavaScript 提交中击败了15.86%的用户。