數據結構-劍指offer-表示數值的字符串

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

       表示數值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC]找到規律是這個題的重點。判斷一個字符串是否表示數值時,可以按照模式對每一爲進行掃描,判斷是否符合要求。上述A和C都是可能以'+'和'-'開頭的0~9的數位串,B是0~9的數位串,但前面不能有正負號。判斷字符串是否符合上述模式時,首先儘可能多的掃描0~9的數位(有可能在起始處有‘+’或者‘-’),也就是前面模式中表示數值整數的A部分。如果遇到小數點’.‘,則開始掃描表示數值小數部分的B部分。如果遇到’e‘或者’E‘,則開始掃描表示數值指數的C部分。

        整個代碼的實現過程就是一個排除掉所有不滿足數值條件的過程。1、判斷string是否爲空,如果爲空,則返回false;2、定義三個布爾邏輯符:sign(’+‘或’-‘)、decimal(小數點’.‘)、hasE(指數符號e或E)爲false;3、循環逐個檢測字符串中的數值:(1)指數符號e或E:e的前後必須爲整數,一個數值表示中只能有一個e或E;(2)小數點’.‘:只能出現一次,不能出現在最後一位,只能出現在e的前面;(3)'+'或’-‘號:第一次出現只能在第一個字符或者指數符號後,第二次出現只能在指數符號之後,不能出現在最後一位;(4)整數位:整數字符只能在’0‘~’9‘之間,不能是其他數據字符。不滿足上述條件的返回false,否則返回true。

代碼:

class Solution {
public:
    bool isNumeric(char* string)
    {
        //把所滿足非數值的條件都返回false,剩餘的滿足條件的都是true
        if(string == nullptr)
            return false;
        bool sign = false, decimal =false, hasE = false;
        for(int i=0;i < strlen(string); i++){
            if(string[i] == 'e' || string[i] == 'E'){
                //string[0]=e,即e的前面不爲整數,返回false
                if(i == 0) return false;
                //string[strlen(string)-1]=e,即e爲字符串最後一個,e的後面不爲整數,返回false
                if(i == strlen(string)-1) return false;
                //一個數值表示中,只能有一個e
                if(hasE) return false;
                hasE = true;
            }
            else if(string[i] == '.'){
                //小數點不能出現在e的後面
                if(hasE || decimal) return false;
                //如果出現在最後一位,返回false
                if(i == strlen(string)-1) return false;
                decimal = true;
            }
            else if(string[i] == '+' || string[i] == '-'){
                //第一次出現只能在第一個字符或指數符號之後
                if(!sign && i != 0 && !hasE) return false;
                //第二次出現只能在指數符號之後
                if(!hasE && sign) return false;
                //’+‘和’-‘不能出現在最後一位,如果出現在最後一位,返回false
                if(i == strlen(string)-1) return false;
                sign = true;
            }
            else if(string[i] < '0' || string[i] > '9') return false;
        }
        return true;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章