亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

leetcode65 valid number 正則表達(dá)式的運(yùn)用

DobbyKim / 1790人閱讀

摘要:完整的正則表達(dá)式為。代碼如下翻譯如果我們看到數(shù)字,就將設(shè)為如果看到小數(shù)點(diǎn),則判斷是否已有小數(shù)點(diǎn)或是,因?yàn)楹笾荒苡姓麛?shù)只能遇到一次,如果第一次遇到但是沒有遇到數(shù)字,則返回錯(cuò)誤。

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

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

空值返回false

字符串前后的空白字符不影響字符串最終的結(jié)果

1.以及.1都是符合標(biāo)準(zhǔn)的小數(shù),但是.不符合

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

思路一:正則表達(dá)式

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

整數(shù)

小數(shù)

包含e

事實(shí)上啊,這是極為不合理的一種分類,因?yàn)樗鼈冎g從數(shù)字構(gòu)成的角度來說相互包含,在判斷時(shí)會(huì)造成代碼的冗余。菜雞版本代碼如下:

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

在稍微深入的了解了正則表達(dá)式之后,我對(duì)于數(shù)字的判斷有了新的認(rèn)識(shí),將數(shù)字先劃分為兩類:包含e以及不包含e。鑒于無論包含或是不包含e,e的前面都必須有數(shù)字。所以這時(shí)候再來分析e前數(shù)字的特性。e前數(shù)字可以為整數(shù)也可以為小數(shù),但這里涉及到小數(shù)點(diǎn)時(shí),又要重新考慮,畢竟.不可以多帶帶存在,但是只要前后任何一個(gè)位置有數(shù)字,就可以稱其為小數(shù)。這是我決定將小數(shù)點(diǎn)后沒有數(shù)字的那一類字符串也劃分到整數(shù)的部分,也就簡化了我的正則表達(dá)式。完整的正則表達(dá)式為^ *[+-]?(([0-9]+.?)|([0-9]*.[0-9]+))(e[+-]?[0-9]+)? *$。
注意!正則表達(dá)式的開頭和結(jié)尾均有空格
代碼如下:

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

一個(gè)完美的正則表達(dá)式帶來的代碼雖然只有一行,但是它的效率一般啊,我也很無奈啊。這時(shí)我參考了一下高效大神的代碼。大神采用的思路就是利用各種flag結(jié)合字符串當(dāng)前位置上的值來判斷該字符串是否合理。代碼如下:

    /**
     * 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設(shè)為true
     *如果看到小數(shù)點(diǎn),則判斷是否已有小數(shù)點(diǎn)或是e,因?yàn)閑后只能有整數(shù)
     *e只能遇到一次,如果第一次遇到e但是沒有遇到數(shù)字,則返回錯(cuò)誤。遇到第一個(gè)e后,將numberAfterE flag標(biāo)注為否以便判斷后序是否有數(shù)字
     *正負(fù)號(hào)的位置只能位于最開始和e緊鄰著右邊那個(gè)位置
     */
    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

這里運(yùn)用的flags的方法其實(shí)非??简?yàn)對(duì)需求的有效分類,尤其是對(duì)字符串中存在e的情況的判斷。這種方式使用O(n)的時(shí)間復(fù)雜度實(shí)現(xiàn)判斷。而在遇到存疑情況時(shí),往往比正常的正則表達(dá)式更有效。

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67247.html

相關(guān)文章

  • [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 評(píng)論0 收藏0
  • 6-9月技術(shù)文章匯總

    摘要:分布式的管理和當(dāng)我在談?wù)摷軜?gòu)時(shí)我在談啥狀態(tài)碼詳解無狀態(tài)協(xié)議和請(qǐng)求支持哪些方法分層協(xié)議棧有哪些數(shù)據(jù)結(jié)構(gòu)運(yùn)用場(chǎng)景說說你常用的命令為什么要有包裝類面向?qū)ο蟮奶卣魇巧妒巧队惺裁春锰幭到y(tǒng)設(shè)計(jì)工程在線診斷系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理軟技能 HTTP 【HTTP】分布式session的管理 【HTTP】Cookie和Session 【HTTP】當(dāng)我在談?wù)揜estFul架構(gòu)時(shí)我在談啥?...

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

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

    jindong 評(píng)論0 收藏0
  • JavaScript數(shù)據(jù)結(jié)構(gòu)與算法-String-(leetcode原題)

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

    KoreyLee 評(píng)論0 收藏0
  • leetcode部分題目答案之JavaScript版

    摘要:自己沒事刷的一些的題目,若有更好的解法,希望能夠一起探討項(xiàng)目地址 自己沒事刷的一些LeetCode的題目,若有更好的解法,希望能夠一起探討 Number Problem Solution Difficulty 204 Count Primes JavaScript Easy 202 Happy Number JavaScript Easy 190 Reverse Bi...

    alphahans 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<