面試題20:表示數(shù)值的字符串

請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。

  • 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數(shù)值。
  • 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

使用正則表達(dá)式去匹配數(shù)字的模式:"[+-]?[0-9]([\.[0-9])?([Ee][+-]?[0-9]+)?"
代碼如下:

public static boolean isNumeric(char[] str) {
        if (str == null || str.length == 0) {
            return false;
        }
        String s = String.valueOf(str);
        //? 匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請(qǐng)使用 \?。
        //* 匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請(qǐng)使用 \*。
        return s.matches("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
    }

思路二:
基本規(guī)則,小數(shù)點(diǎn)和E,e只能出現(xiàn)一次,小數(shù)點(diǎn)后必須有數(shù)字,E,e后必須是+-,并且后面必須有數(shù)字,否則剩下的字符必須是數(shù)字。
如果只有一位數(shù)字,判斷是否是整數(shù),不是返回false;設(shè)置兩個(gè)標(biāo)志位判斷是否出現(xiàn)小數(shù)點(diǎn)或者E,e;然后遍歷字符串,如果首位是+-,則判斷是否是第一個(gè)字符,如果不是,并且前一個(gè)字符也不是E,e,則返回false;如果當(dāng)前字符是Ee,則不可能是最后一位,并且之前沒有出現(xiàn)過,不滿足返回false,滿足標(biāo)志位改為Ee出現(xiàn)了。如果是小數(shù)點(diǎn),只能出現(xiàn)一次,并且在E,e之前,滿足條件小數(shù)點(diǎn)標(biāo)志位改為出現(xiàn)。
最后的情況就是必須是數(shù)字。
一直沒有跳出來,說明都滿足,返回true。
代碼如下:

/**
     * @param str
     * @return
     */
    public static boolean isNumeric1(char[] str) {
        if (str == null || str.length == 0) {
            return false;
        }
        //長(zhǎng)度只有1,必須在0-9之間
        if (str.length == 1 && (str[0] < '0' || str[0] > '9')) {
            return false;
        }
        boolean hasDot = false;
        boolean hasE = false;
        for (int i = 0; i < str.length; i++) {
            //判斷+-號(hào)的特殊情況
            if (str[i] == '+' || str[i] == '-') {
                //第二次出現(xiàn)正負(fù)號(hào),前一個(gè)字符必須是E,e
                if (i != 0 && str[i - 1] != 'E' && str[i - 1] != 'e') return false;
            } else if (str[i] == 'E' || str[i] == 'e') {
                //e:只有一個(gè)并且后面必須有數(shù)字==它不可能是最后一位
                if (i == str.length - 1) return false;
                if (hasE) return false;
                hasE = true;
            } else if (str[i] == '.') {
                //只能出現(xiàn)一次,并且e和E以后不可能出現(xiàn)
                if (hasDot || hasE) return false;
                hasDot = true;
            } else if (str[i] < '0' || str[i] > '9') {
                //否則只能是數(shù)字
                return false;
            }
        }
        return true;
    }

/**
     * 劍指offer
        分為A.B+C三部分去判斷是否滿足條件
     */
    private int index = 0;

    public boolean isNumeric3(char[] str) {
        if (str.length < 1)
            return false;

        boolean flag = scanInteger(str);

        if (index < str.length && str[index] == '.') {
            index++;
            flag = scanUnsignedInteger(str) || flag;
        }

        if (index < str.length && (str[index] == 'E' || str[index] == 'e')) {
            index++;
            flag = flag && scanInteger(str);
        }

        return flag && index == str.length;

    }

    private boolean scanInteger(char[] str) {
        if (index < str.length && (str[index] == '+' || str[index] == '-') )
            index++;
        return scanUnsignedInteger(str);

    }

    private boolean scanUnsignedInteger(char[] str) {
        int start = index;
        while (index < str.length && str[index] >= '0' && str[index] <= '9')
            index++;
        return start < index; //是否存在整數(shù)
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容