LeetCode:Valid Number - 判斷字符串中內容是否爲數字

一、題目名稱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

相關文章
相關標籤/搜索