资讯专栏INFORMATION COLUMN

leetcode65 valid number 正则表达式的运用

DobbyKim / 1524人阅读

摘要:完整的正则表达式为。代码如下翻译如果我们看到数字,就将设为如果看到小数点,则判断是否已有小数点或是,因为后只能有整数只能遇到一次,如果第一次遇到但是没有遇到数字,则返回错误。

题目要求
Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

写一个算法 判断输入的字符串是否是数字。
这道题的需求给的较为模糊,对于什么是数字并没有给出明确的定义。这里我要给出几个特殊的情况来说明数字究竟是什么。

空值返回false

字符串前后的空白字符不影响字符串最终的结果

1.以及.1都是符合标准的小数,但是.不符合

e的前后必须有数字,e前的数字可以为整数或是小数,e后的数字必须为正/负整数/0

思路一:正则表达式

关于正则表达式的入门,请参考我的前不久写的一篇博客。在还没有了解正则表达式的时候,我将数字分为三种

整数

小数

包含e

事实上啊,这是极为不合理的一种分类,因为它们之间从数字构成的角度来说相互包含,在判断时会造成代码的冗余。菜鸡版本代码如下:

    public boolean isNumber(String s) {
        s = s.trim();
        if(s.contains("e")){
            String firstPart = s.substring(0, s.indexOf("e"));
            String secondPart = s.indexOf("e")+1 >= s.length() ? "" : s.substring(s.indexOf("e")+1);
            return (isInteger(firstPart) || isDouble(firstPart)) && isInteger(secondPart);
        }else if(s.contains(".")){
            return isDouble(s);
        }else{
            return isInteger(s);
        }
        
    }
    
    public boolean isDouble(String s){
        if(s.startsWith("-") || s.startsWith("+")){
            s = s.substring(1);
        }
        if(s.length() <= 1){
            return false;
        }
        return s.matches("^([0-9]*)?+.([0-9]*)$");
    }
    
    public boolean isInteger(String s){
        return s.matches("^(-|+)?([0-9]{1,})$");
    }

在稍微深入的了解了正则表达式之后,我对于数字的判断有了新的认识,将数字先划分为两类:包含e以及不包含e。鉴于无论包含或是不包含e,e的前面都必须有数字。所以这时候再来分析e前数字的特性。e前数字可以为整数也可以为小数,但这里涉及到小数点时,又要重新考虑,毕竟.不可以多带带存在,但是只要前后任何一个位置有数字,就可以称其为小数。这是我决定将小数点后没有数字的那一类字符串也划分到整数的部分,也就简化了我的正则表达式。完整的正则表达式为^ *[+-]?(([0-9]+.?)|([0-9]*.[0-9]+))(e[+-]?[0-9]+)? *$
注意!正则表达式的开头和结尾均有空格
代码如下:

    public boolean isNumber2(String s){
        return s.matches("^ *[+-]?(([0-9]+.?)|([0-9]*.[0-9]+))(e[+-]?[0-9]+)? *$");
    }
思路二:flags

一个完美的正则表达式带来的代码虽然只有一行,但是它的效率一般啊,我也很无奈啊。这时我参考了一下高效大神的代码。大神采用的思路就是利用各种flag结合字符串当前位置上的值来判断该字符串是否合理。代码如下:

    /**
     * We start with trimming.
     * If we see [0-9] we reset the number flags.
     * We can only see . if we didn"t see e or ..
     * We can only see e if we didn"t see e but we did see a number. We reset numberAfterE flag.
     * We can only see + and - in the beginning and after an e
     * any other character break the validation.
     * At the end it is only valid if there was at least 1 number and if we did see an e then a number after it as well.
     * So basically the number should match this regular expression:
     * [-+]?(([0-9]+(.[0-9]*)?)|.[0-9]+)(e[-+]?[0-9]+)?
     *
     *翻译:
     *如果我们看到数字,就将numberFlag设为true
     *如果看到小数点,则判断是否已有小数点或是e,因为e后只能有整数
     *e只能遇到一次,如果第一次遇到e但是没有遇到数字,则返回错误。遇到第一个e后,将numberAfterE flag标注为否以便判断后序是否有数字
     *正负号的位置只能位于最开始和e紧邻着右边那个位置
     */
    public boolean isNumber3(String s){
        s = s.trim();
        boolean pointSeen = false;
        boolean eSeen = false;
        boolean numberSeen = false;
        boolean numberAfterE = true;
        for(int i=0; i

这里运用的flags的方法其实非常考验对需求的有效分类,尤其是对字符串中存在e的情况的判断。这种方式使用O(n)的时间复杂度实现判断。而在遇到存疑情况时,往往比正常的正则表达式更有效。

想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67247.html

相关文章

  • [LeetCode] 65. Valid Number

    Problem Validate if a given string can be interpreted as a decimal number. Some examples: 0 => true 0.1 => true abc => false 1 a => false 2e10 => true -90e3 => true 1e => false e3 => false 6e-...

    SoapEye 评论0 收藏0
  • 6-9月技术文章汇总

    摘要:分布式的管理和当我在谈论架构时我在谈啥状态码详解无状态协议和请求支持哪些方法分层协议栈有哪些数据结构运用场景说说你常用的命令为什么要有包装类面向对象的特征是啥是啥有什么好处系统设计工程在线诊断系统设计与实现索引背后的数据结构及算法原理软技能 HTTP 【HTTP】分布式session的管理 【HTTP】Cookie和Session 【HTTP】当我在谈论RestFul架构时我在谈啥?...

    miya 评论0 收藏0
  • LeetCode65. Valid Number -- 判断合法数字

    摘要:描述分析该题的说明比较模糊,所以需要慢慢进行尝试来弄清楚哪些是合法的数字。代码去除前后的空格小数点前面不能出现和小数点前面不能出现,并且需要有数字保证后面也有数字符号只能再位和后面一位 描述 Validate if a given string is numeric. Some examples:0 => true 0.1 => trueabc => false1 a => fals...

    jindong 评论0 收藏0
  • JavaScript数据结构与算法-String-(leetcode原题)

    摘要:重复出现的子串要计算它们出现的次数。示例输入输出解释有个子串,,,,它们具有相同数量的连续和。注意在到之间。以此类推,剃掉原字符串的第一个字符后再调用一次方法,直到原字符串只剩下个字符,返回数组的长度,即为题解。 博客原文地址:https://finget.github.io/2019... 反转整数 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 ...

    KoreyLee 评论0 收藏0
  • leetcode部分题目答案之JavaScript版

    摘要:自己没事刷的一些的题目,若有更好的解法,希望能够一起探讨项目地址 自己没事刷的一些LeetCode的题目,若有更好的解法,希望能够一起探讨 Number Problem Solution Difficulty 204 Count Primes JavaScript Easy 202 Happy Number JavaScript Easy 190 Reverse Bi...

    alphahans 评论0 收藏0

发表评论

0条评论

DobbyKim

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<