20 表示數值的字串
阿新 • • 發佈:2019-02-14
題目:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路: [sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]
其中,('['和']'之間的為可有可無的部分)。
在數值之前可能有一個表示正負的'+'或者'-'。接下來是若干個0到9的數位表示數值的整數部分(在某些小數裡可能沒有數值的整數部分)。如果數值是一個小數,那麼在小數後面可能會有若干個0到9的數位表示數值的小數部分。如果數值用科學記數法表示,接下來是一個'e'或者'E',以及緊跟著的一個整數(可以有正負號)表示指數。
判斷一個字串是否符合上述模式時,首先看第一個字元是不是正負號。如果是,在字串上移動一個字元,繼續掃描剩餘的字串中0到9的數位。如果是一個小數,則將遇到小數點。另外,如果是用科學記數法表示的數值,在整數或者小數的後面還有可能遇到'e'或者'E'。
class Solution { public: bool isNumeric(char* string) { if(string==NULL||*string=='\0') return false; if(*string=='+'||*string=='-') ++string; bool isnum=true; isint(&string); if(*string!='\0') { if(*string=='.') { ++string; isint(&string); if(*string=='e'||*string=='E') isnum=isexp(&string); } else if(*string=='e'||*string=='E') isnum=isexp(&string); else return false; } return isnum&&(*string)=='\0'; } private: void isint(char** string) //函式引數需要指標傳遞的方式,所以是雙指標 { while(**string!='\0'&&**string>='0'&&**string<='9') //掃描如果是數字,直接跳過 ++(*string); } bool isexp(char** string) { ++(*string); //這裡不能少,判斷是‘e’ 得先後移一位 if(**string=='+'||**string=='-') ++(*string); if(**string=='\0') return false; //符號後面必須要有數字 isint(string); if(**string=='\0') return true; else return false; } };