一、題目名稱java
Valid Number(判斷字符串中內容是否爲數字)正則表達式
二、題目地址code
https://leetcode.com/problems/valid-number/leetcode
三、題目內容開發
英文:Validate if a given string is numeric.字符串
中文:給出一個字符串,檢查這個字符串中內容是不是一個數字get
例如:「0」、「 0.1」、「2e10」是數字,「abc」、「1 a」不是數字編譯器
四、解題方法1string
使用正則表達式檢查字符串是一個比較好的方法,正則表達式的結構以下圖所示:it
對應的正則表達式爲:^([+-])?((\d+)(\.)?(\d+)?|(\d+)?(\.)?(\d+))(e([+-])?(\d+))?$
Java代碼以下,注意爲了讓編譯器不把字符「\」識別爲轉義字符,須將「\」轉換爲「\\」使用。
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 功能說明:LeetCode 65 - Valid Number * 開發人員:Tsybius2014 * 開發時間:2015年9月18日 */ public class Solution { /** * 判斷指定字符串是否爲數字 * @param s 字符串 * @return true:是數字 false:不是數字 */ public boolean isNumber(String s) { s = s.trim(); if (s.isEmpty()) { return false; } //正則匹配 Pattern p = Pattern.compile( "^([+-])?((\\d+)(\\.)?(\\d+)?|(\\d+)?(\\.)?(\\d+))(e([+-])?(\\d+))?$"); Matcher m = p.matcher(s); if (m.find()) { return true; } return false; } }
五、解題方法2
上面的方法我在OJ上運行花了484ms,雖然代碼很清晰,代碼長度也控制在很短的範圍,但使用時間比較長。若是但願提升速度,能夠使用有限狀態機來處理這個問題。
狀態機各狀態圖以下:
(其中每一個狀態接收到額外輸入時都會跳轉到FAILURE狀態)
一段實現此功能的Java代碼以下,這段代碼在OJ上的效率爲316ms。
/** * 功能說明:LeetCode 65 - Valid Number * 開發人員:Tsybius2014 * 開發時間:2015年9月19日 */ public class Solution { /** * 判斷指定字符串是否爲數字 * @param s 字符串 * @return true:是數字 false:不是數字 */ public boolean isNumber(String s) { s = s.trim(); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == 'x') { return false; } } s = s + 'x'; //x爲標記字符串結束的字符 State curState = State.STATE_BEGIN; for (int i = 0; i < s.length(); i++) { curState = getNextState(curState, s.charAt(i)); if (curState == State.STATE_SUCCESS) { return true; } else if (curState == State.STATE_FAILURE) { return false; } } return false; } //狀態枚舉 private enum State { //啓動 STATE_BEGIN, //正負號 STATE_SIGN, //整數部分 STATE_NUM_INT, //小數點1 STATE_DOT1, //小數點2 STATE_DOT2, //小數部分 STATE_NUM_DEC, //指數符號e STATE_E, //指數正負號 STATE_SIGN_E, //指數數字 STATE_NUM_E, //正常結束 STATE_SUCCESS, //異常結束 STATE_FAILURE }; /** * 根據當前字符與當前狀態獲取下一個狀態 * @param state * @param ch * @return */ private State getNextState(State state, char ch) { switch (state) { case STATE_BEGIN: return getNextStateBegin(ch); case STATE_SIGN: return getNextStateSign(ch); case STATE_NUM_INT: return getNextStateNumInt(ch); case STATE_DOT1: return getNextStateDot1(ch); case STATE_DOT2: return getNextStateDot2(ch); case STATE_NUM_DEC: return getNextStateNumDec(ch); case STATE_E: return getNextStateE(ch); case STATE_SIGN_E: return getNextStateSignE(ch); case STATE_NUM_E: return getNextStateNumE(ch); case STATE_SUCCESS: return State.STATE_SUCCESS; case STATE_FAILURE: return State.STATE_FAILURE; default: break; } return State.STATE_FAILURE; } /** * 初始狀態 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateBegin(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_INT; case '+': case '-': return State.STATE_SIGN; case '.': return State.STATE_DOT1; default: return State.STATE_FAILURE; } } /** * 正負號 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateSign(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_INT; case '.': return State.STATE_DOT1; default: return State.STATE_FAILURE; } } /** * 整數部分 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateNumInt(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_INT; case '.': return State.STATE_DOT2; case 'e': return State.STATE_E; case 'x': return State.STATE_SUCCESS; default: return State.STATE_FAILURE; } } /** * 小數點1 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateDot1(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_DEC; default: return State.STATE_FAILURE; } } /** * 小數點2 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateDot2(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_DEC; case 'e': return State.STATE_E; case 'x': return State.STATE_SUCCESS; default: return State.STATE_FAILURE; } } /** * 小數部分 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateNumDec(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_DEC; case 'e': return State.STATE_E; case 'x': return State.STATE_SUCCESS; default: return State.STATE_FAILURE; } } /** * 指數符號e * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateE(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_E; case '+': case '-': return State.STATE_SIGN_E; default: return State.STATE_FAILURE; } } /** * 指數正負號 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateSignE(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_E; default: return State.STATE_FAILURE; } } /** * 指數數字 * @param ch 輸入字符 * @return 下一個狀態 */ private State getNextStateNumE(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return State.STATE_NUM_E; case 'x': return State.STATE_SUCCESS; default: return State.STATE_FAILURE; } } }
END