摘要:完整的正則表達式為。代碼如下翻譯如果我們看到數字,就將設為如果看到小數點,則判斷是否已有小數點或是,因為后只能有整數只能遇到一次,如果第一次遇到但是沒有遇到數字,則返回錯誤。
題目要求
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)的時間復雜度實現判斷。而在遇到存疑情況時,往往比正常的正則表達式更有效。
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注我的微信公眾號!將會不定期的發放福利哦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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-...
摘要:分布式的管理和當我在談論架構時我在談啥狀態碼詳解無狀態協議和請求支持哪些方法分層協議棧有哪些數據結構運用場景說說你常用的命令為什么要有包裝類面向對象的特征是啥是啥有什么好處系統設計工程在線診斷系統設計與實現索引背后的數據結構及算法原理軟技能 HTTP 【HTTP】分布式session的管理 【HTTP】Cookie和Session 【HTTP】當我在談論RestFul架構時我在談啥?...
摘要:描述分析該題的說明比較模糊,所以需要慢慢進行嘗試來弄清楚哪些是合法的數字。代碼去除前后的空格小數點前面不能出現和小數點前面不能出現,并且需要有數字保證后面也有數字符號只能再位和后面一位 描述 Validate if a given string is numeric. Some examples:0 => true 0.1 => trueabc => false1 a => fals...
摘要:重復出現的子串要計算它們出現的次數。示例輸入輸出解釋有個子串,,,,它們具有相同數量的連續和。注意在到之間。以此類推,剃掉原字符串的第一個字符后再調用一次方法,直到原字符串只剩下個字符,返回數組的長度,即為題解。 博客原文地址:https://finget.github.io/2019... 反轉整數 給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。 示例 ...
摘要:自己沒事刷的一些的題目,若有更好的解法,希望能夠一起探討項目地址 自己沒事刷的一些LeetCode的題目,若有更好的解法,希望能夠一起探討 Number Problem Solution Difficulty 204 Count Primes JavaScript Easy 202 Happy Number JavaScript Easy 190 Reverse Bi...
閱讀 3074·2021-09-28 09:43
閱讀 906·2021-09-08 09:35
閱讀 1445·2019-08-30 15:56
閱讀 1189·2019-08-30 13:00
閱讀 2735·2019-08-29 18:35
閱讀 1835·2019-08-29 14:07
閱讀 3440·2019-08-29 13:13
閱讀 1336·2019-08-29 12:40