1. 程式人生 > 實用技巧 >劍指53.表示數值的字串

劍指53.表示數值的字串

題目描述

請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路

思路1:呼叫庫函式。通過呼叫Double類的轉換成Double型別的方法,判斷轉換的過程當中是否丟擲異常即可。

用Double.parseDouble()是把字串變成double型別。
如果要變成int,則用Integer.parseInt()

思路2:模擬法。可以從正面考慮也可以從反面考慮,具體見程式碼。難點在於歸納所有的正確情況或者錯誤情況。

思路3:使用正則表示式。

☆解法1

public class Solution {
    public boolean isNumeric(char[] str) {
        //String s = String.valueOf(str);
        String s = new String(str);
        // 要單獨處理,例如輸入 "959.94f" 不會丟擲異常 
        if (s.endsWith("f") || s.endsWith("d")|| s.endsWith("F")|| s.endsWith("D"))
            return
false; try { Double.parseDouble(s); }catch (Exception e){ return false; } return true; } }

解法2.1(考慮反面情況,只能通過牛客)

public class Solution {
    public boolean isNumeric(char[] str) {
        if (str == null || str.length == 0)
            return
false; // 標記符號,小數點,e是否出現過 boolean sign = false, decimal = false, hasE = false; for (int i = 0; i < str.length; i++) { if (str[i] == 'e' || str[i] == 'E'){ if (i == 0 || i == str.length - 1) return false; // e不能位於首位和末尾 if (str[i - 1] == '.') return false; // e不能直接在小數點後面 if (hasE) return false; // 只能出現1個e hasE = true; }else if (str[i] == '+' || str[i] == '-'){ if (!sign && i != 0 && str[i-1] != 'e' && str[i-1] != 'E') return false; // 符號第一次出現必須在首位或者E後邊 if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false; // 符號第二次出現必須在e後邊 sign = true; }else if (str[i] == '.'){ if (hasE || decimal) return false; // E後邊不能有小數,並且小數點只能出現一次 if (i == str.length - 1) return false; // 小數點不能出現在最後一位 decimal = true; }else if (str[i] < '0' || str[i] > '9'){ // 不合法字元 return false; } } return true; } }

☆☆解法2.2(考慮正面情況,牛客力扣均能AC)

public class Solution {
    public boolean isNumeric(char[] str) {
        if (str == null || str.length == 0)
            return false;
        // 標記是否遇到數位、小數點、‘e’或'E'
        boolean numFlag = false,dotFlag = false, eFlag = false;
        for (int i = 0; i < str.length; i++) {
            // 判定為數字
            if (str[i] >= '0' && str[i] <= '9'){
                numFlag = true;
                // 判定為.  需要沒出現過.並且沒出現過e
            }else if (str[i] == '.' && !dotFlag && !eFlag){
                dotFlag = true;
                // 判定為e 需要沒出現過e,並且出現過數字了
            }else if ((str[i] == 'e' || str[i] == 'E') && !eFlag && numFlag){
                eFlag = true;
                numFlag = false; //重置isNum,因為‘e’或'E'之後也必須接上整數,防止出現 123e或者123e+的非法情況
                // 判定為+-符號 只能出現在第一位或者緊跟e後面
            }else if ((str[i] == '+' || str[i] == '-') && (i == 0 || str[i-1] == 'e' || str[i-1] == 'E')){

            }else { // 其他情況都是非法的
                return false;
            }
        }
        return numFlag;
    }
}

解法3

Mark