1. 程式人生 > >劍指offer 面試題20:表示數值的字串

劍指offer 面試題20:表示數值的字串

請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+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都是整數(可以有正負號也可以沒有),B是一個無符號整數

class Solution {
public:
    bool scanUnsignedInteger(char ** str) //掃描無符號整數
    {
        char * before =*str;
        while(**str!='\0' && **str>='0'&&**str<='9') ++(*str);
        return *str > before;  //看是否真正有數字
    }
    bool scanInteger(char ** str)   //掃描可能帶符號的整數
    {
        if(**str =='+' || **str=='-') ++(*str);   //看是否有正負號
        return scanUnsignedInteger(str);
    }
    bool isNumeric(char* string)
    {
        if(string==nullptr) return false;
        bool num = scanInteger(&string);  //傳string的地址,可以記錄當前操作到原始資料的哪個位置
        if(*string == '.')  //遇到小數點
        {
            ++string;
            //.123  0.123  223.   223.0   223.5
            //小數點後有數字,小數點前有數字,小數點前後都有數字
            num = scanUnsignedInteger(&string) ||num ;//滿足前面是數字小數點或者後面是無符號數字
        }
        if(*string == 'e' ||*string == 'E')   //遇到指數
        {
            ++string;
            //e前面沒數字,整個字元不能代表數字,.e1  e1
            //e後面沒數字,整個字元不能代表數字,如12e   1e5.2
            num = scanInteger(&string) && num;  //前面滿足數字條件並且e後面是有符號數字
        }
        return num && *string=='\0';
    }
};