劍指 offer20

一拳一個哇哦怪發表於2020-12-24

劍指 Offer 20. 表示數值的字串

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

首先,我們可以看到,對於一個字串,可能存在小數點,正負號,指數符號,數值。

並且在字串的開頭和末尾部分還可能有若干個空格。因此,對於一個字串,首先要略過開頭和末尾的空格。

bool isNumber(string s) {
    int n=s.size();
    int index=-1;
    bool hasDot= false,hasE= false,hasOp=false,hasNum= false;
    while(index<n && s[++index]==' ');//開頭可能含有若干個空格
    
    while(index<n)
    {
        if('0'<=s[index]&&s[index]<='9')//如果當前字串為 Num,令 hasNum=true
            hasNum=true;
        else if(s[index]=='e'||s[index]=='E')//如果當前字串為 E或者 e,令 hasE=true
        {
            if(hasE||!hasNum)//如果此前未出現數字就出現了 E或者第二次出現 E,則不合法
                return false;
            //對於 E 後面的字串重新考慮
            hasE=true;
            hasOp=false;
            hasDot=false;
            hasNum=false;
        }else if(s[index]=='+'||s[index]=='-')//當前字元為正負號
        {
            if(hasOp||hasNum||hasDot)
                return false;
        }else if(s[index]=='.')//當前字元為.
        {
            if(hasDot||hasE)
                return false;
            hasDot=true;  
        }else if(s[index]==' ')//當前字元為空格,則跳出迴圈
        {
            break;
        } else{
            return false;
        }
        ++index;
    }
    while(index<n &&s[++index]==' ');//末尾可能含有若干個空格
    return hasNum &&index==n;
    }

相關文章