劍指offer----表示數值的字串
阿新 • • 發佈:2018-12-14
題目描述 請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示數值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
//分解問題,有e的話,判斷e(E)的兩邊是不是數字,沒e的話,直接判斷整個字串 //是不是數字,有多個e則以第一個e把字串劃分為兩半 class Solution { public: //判斷劃分後的字元是不是數字 bool sub_is_num(string str) { if(str.size()==0)return false; //判斷第一個是否是符號位,如果是則去掉 if(str[0]=='+'||str[0]=='-') { str=str.substr(1); } //定義一個標記mark,如果已經有一個小數點,當前字元也是小數點,則一定不是 //一個數字 bool mark=false; for(auto m:str) { if(m=='.') { if(mark==false)mark=true; else return false; continue; } //如果不為數字且不為小數點,則一定不是數字 if(m<'0'||m>'9')return false; } //成功避開了所有不是數字的條件判斷,那一定是個數字 return true; } bool isNumeric(char* string1) { if(*string1=='\0')return false; //以第一個e(E)分割字串為兩半 int mark_i=0; while(string1[mark_i]!='\0') { if(string1[mark_i]=='e'||string1[mark_i]=='E')break; ++mark_i; } if(string1[mark_i]=='\0') { return sub_is_num(string1); } else { string mark_string(string1); string str1(mark_string.begin(),mark_string.begin()+mark_i),str2(mark_string.begin()+mark_i+1,mark_string.end()); //如果分成兩半的字串中的第二個字串中含有'.',那整個字串一定不是數字 for(auto m:str2) { if(m=='.')return false; } return sub_is_num(str1)&&sub_is_num(str2); } } };