剑指 20. 表示数值的字符串 - 难度中等

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%的用户。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值