表示數(shù)值的字符串

題目描述

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

解法一:

通過觀察我們發(fā)現(xiàn),字符串為數(shù)值需滿足以下幾個條件:
1、可以包含E或e,也可以不包含E或e
2、若包含E或e,則只能出現(xiàn)一次,且不在字符串末尾
3、E或e前面的部分可以是整數(shù)也可以是小數(shù),之后的部分只能是整數(shù)。
由此我們只需要判斷字符串是否包含E或e,且前半部分是否是整數(shù)或小數(shù),后半部分是否是小數(shù)即可。

public class Solution {
    public boolean isNumeric(char[] str) {
        int i = 0;
        for(i = 0; i < str.length; i++) {
            if(str[i] == 'E' || str[i] == 'e') {
                break;
            }
        }
        //E(或e)的位置不能為字符串末尾
        if(i == str.length - 1) {
            return false;
        }
        //字符串不含E或e
        else if(i == str.length) {
            return isNumber(str, 0, str.length - 1);
        }
        //字符串含E或e,且不在字符串末尾
        else {
            if(isNumber(str, 0, i - 1) && isNumber(str, i + 1, str.length - 1)) {
                if(isInt(str, i + 1, str.length - 1)) {
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                return false;
            }
        }
    }
    
    //判斷是否是合法數(shù)字(整數(shù)或小數(shù))
    public boolean isNumber(char[] str, int start, int end) {
        int pointCount = 0;
        for(int i = start; i <= end; i++) { if(str[i] >= '0' && str[i] <= '9') {
                continue;
            }
            if(str[i] == '.') {
                if(pointCount == 0) {
                    pointCount++;
                    continue;
                }
                else {
                    return false;
                }
            }
            else {
                //處理+-號問題
                boolean isSymbol = (i == start) && (str[i] == '+' || str[i] == '-');
                if(isSymbol) {
                    continue;
                }
                else {
                    return false;
                }
            }
        }
        return true;
    }
    //在已知為合法數(shù)字的基礎上判斷是否是整數(shù)
    public boolean isInt(char[] str, int start, int end) {
        for(int i = start; i <= end; i++) { 
            if(str[i] == '.') {
                return false;
            }
        }
        return true;
    }
}
解法二:

表示字符的字符串遵循模式:
A[.[B]][e|EC],如100、1.2、1.2e、1.2E+4
或.B[e|EC],如.2、.3e-2
其中A和C表示整數(shù)(可以有符號)、B表示無符號整數(shù)。
于是對于一個字符串,我們可以先判斷其開頭是否為A部分,判斷之后是否為小數(shù)點,若有小數(shù)點之后是否為B部分,之后是否為e|E,若為e|E之后是否為C部分。

public class Solution {
    public boolean isNumeric(char[] str) {
        int index = scanInteger(str, 0);
        if((index < str.length) && (str[index] == '.')) {
            index = scanUnsignedInteger(str, index + 1);
        }
        boolean isE = (index < str.length - 1) && (str[index] == 'E' || str[index] == 'e');
        if(isE) {
            index = scanInteger(str, index + 1);
        }
        if(index == str.length) {
            return true;
        }
        else {
            return false;
        }
    }
    /**判斷是否為A或C部分*/
    public int scanInteger(char[] str, int start) {
        int end = start;
        boolean isSymbol = (end < str.length) && (str[end] == '+' || str[end] == '-');
        if(isSymbol) {
             end++;
        }
        return scanUnsignedInteger(str, end);
    }
    /**判斷是否為B部分*/
    public int scanUnsignedInteger(char[] str, int start) {
        int end = start;
        while((end < str.length) && (str[end] >= '0' && str[end] <= '9')) {
            end++;
        }
        return end;
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容