摘要:完整的正則表達(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
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-...
摘要:分布式的管理和當(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í)我在談啥?...
摘要:描述分析該題的說明比較模糊,所以需要慢慢進(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...
摘要:重復(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)。 示例 ...
摘要:自己沒事刷的一些的題目,若有更好的解法,希望能夠一起探討項(xiàng)目地址 自己沒事刷的一些LeetCode的題目,若有更好的解法,希望能夠一起探討 Number Problem Solution Difficulty 204 Count Primes JavaScript Easy 202 Happy Number JavaScript Easy 190 Reverse Bi...
閱讀 3234·2021-09-28 09:43
閱讀 1058·2021-09-08 09:35
閱讀 1579·2019-08-30 15:56
閱讀 1322·2019-08-30 13:00
閱讀 2869·2019-08-29 18:35
閱讀 1975·2019-08-29 14:07
閱讀 3637·2019-08-29 13:13
閱讀 1478·2019-08-29 12:40