成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

leetcode65 valid number 正則表達式的運用

DobbyKim / 1711人閱讀

摘要:完整的正則表達式為。代碼如下翻譯如果我們看到數(shù)字,就將設為如果看到小數(shù)點,則判斷是否已有小數(shù)點或是,因為后只能有整數(shù)只能遇到一次,如果第一次遇到但是沒有遇到數(shù)字,則返回錯誤。

題目要求
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.

寫一個算法 判斷輸入的字符串是否是數(shù)字。
這道題的需求給的較為模糊,對于什么是數(shù)字并沒有給出明確的定義。這里我要給出幾個特殊的情況來說明數(shù)字究竟是什么。

空值返回false

字符串前后的空白字符不影響字符串最終的結果

1.以及.1都是符合標準的小數(shù),但是.不符合

e的前后必須有數(shù)字,e前的數(shù)字可以為整數(shù)或是小數(shù),e后的數(shù)字必須為正/負整數(shù)/0

思路一:正則表達式

關于正則表達式的入門,請參考我的前不久寫的一篇博客。在還沒有了解正則表達式的時候,我將數(shù)字分為三種

整數(shù)

小數(shù)

包含e

事實上啊,這是極為不合理的一種分類,因為它們之間從數(shù)字構成的角度來說相互包含,在判斷時會造成代碼的冗余。菜雞版本代碼如下:

    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,})$");
    }

在稍微深入的了解了正則表達式之后,我對于數(shù)字的判斷有了新的認識,將數(shù)字先劃分為兩類:包含e以及不包含e。鑒于無論包含或是不包含e,e的前面都必須有數(shù)字。所以這時候再來分析e前數(shù)字的特性。e前數(shù)字可以為整數(shù)也可以為小數(shù),但這里涉及到小數(shù)點時,又要重新考慮,畢竟.不可以多帶帶存在,但是只要前后任何一個位置有數(shù)字,就可以稱其為小數(shù)。這是我決定將小數(shù)點后沒有數(shù)字的那一類字符串也劃分到整數(shù)的部分,也就簡化了我的正則表達式。完整的正則表達式為^ *[+-]?(([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]+)?
     *
     *翻譯:
     *如果我們看到數(shù)字,就將numberFlag設為true
     *如果看到小數(shù)點,則判斷是否已有小數(shù)點或是e,因為e后只能有整數(shù)
     *e只能遇到一次,如果第一次遇到e但是沒有遇到數(shù)字,則返回錯誤。遇到第一個e后,將numberAfterE flag標注為否以便判斷后序是否有數(shù)字
     *正負號的位置只能位于最開始和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)的時間復雜度實現(xiàn)判斷。而在遇到存疑情況時,往往比正常的正則表達式更有效。

想要了解更多開發(fā)技術,面試教程以及互聯(lián)網公司內推,歡迎關注我的微信公眾號!將會不定期的發(fā)放福利哦~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.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月技術文章匯總

    摘要:分布式的管理和當我在談論架構時我在談啥狀態(tài)碼詳解無狀態(tài)協(xié)議和請求支持哪些方法分層協(xié)議棧有哪些數(shù)據(jù)結構運用場景說說你常用的命令為什么要有包裝類面向對象的特征是啥是啥有什么好處系統(tǒng)設計工程在線診斷系統(tǒng)設計與實現(xiàn)索引背后的數(shù)據(jù)結構及算法原理軟技能 HTTP 【HTTP】分布式session的管理 【HTTP】Cookie和Session 【HTTP】當我在談論RestFul架構時我在談啥?...

    miya 評論0 收藏0
  • LeetCode65. Valid Number -- 判斷合法數(shù)字

    摘要:描述分析該題的說明比較模糊,所以需要慢慢進行嘗試來弄清楚哪些是合法的數(shù)字。代碼去除前后的空格小數(shù)點前面不能出現(xiàn)和小數(shù)點前面不能出現(xiàn),并且需要有數(shù)字保證后面也有數(shù)字符號只能再位和后面一位 描述 Validate if a given string is numeric. Some examples:0 => true 0.1 => trueabc => false1 a => fals...

    jindong 評論0 收藏0
  • JavaScript數(shù)據(jù)結構與算法-String-(leetcode原題)

    摘要:重復出現(xiàn)的子串要計算它們出現(xiàn)的次數(shù)。示例輸入輸出解釋有個子串,,,,它們具有相同數(shù)量的連續(xù)和。注意在到之間。以此類推,剃掉原字符串的第一個字符后再調用一次方法,直到原字符串只剩下個字符,返回數(shù)組的長度,即為題解。 博客原文地址:https://finget.github.io/2019... 反轉整數(shù) 給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進行反轉。 示例 ...

    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

發(fā)表評論

0條評論

DobbyKim

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<