面試題20:表示數值的字串
阿新 • • 發佈:2018-12-09
題意:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
/*
合法的浮點數有兩種表示形式:
十進位制小數形式。他有數字和小數點組成,必須有小數點。例如(123.)(123.0)(.123)。
指數形式。如123e3。字母e(或E)之前必須有數字,e後面的指數必須為整數。
規範化的指數形式裡面,小數點前面有且只有一位非零的數字。如1.2345e8
*/
所以只需要考慮三種數值:
1:整數,只要判斷字串中是否只包含'+','-',[0~9]就可以了
2:小數,只要判斷字串中是否只包含'+','-',[0~9],'.';'.'的個數為1,就可以了
3:指數,先找‘e’或者‘E’,再找這個字元左邊的數和右邊的數,左邊可以為整數或者小數,右邊只能為整數。
class Solution { public: bool integer(char* str)//整數 { for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < strlen(str); i++) { if ( str[i] < '0' || str[i] > '9' ) return false; } return true; } bool decimal1(char* str)//小數 { int flag = 0; for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < strlen(str); i++) { if (str[i] < '0' || str[i] > '9') { if (str[i] == '.') { flag++; if (flag >= 2) return false; } else return false; } } return true; } bool decimal2(char* str)//指數 { int flag = 0; int pos=-1; for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < strlen(str); i++) { if (str[i] < '0' || str[i] > '9') { if (str[i] == 'e' || str[i] == 'E') { pos = i; break; } } } char* left = new char[100]; for (int i = 0; i < pos; i++) left[i] = str[i]; left[pos] = '\0'; char* right = new char[100]; for (int i = pos + 1; i < strlen(str); i++) right[i - pos - 1] = str[i]; right[strlen(str) - pos-1] = '\0'; if (strlen(left) == 0 || strlen(right) == 0) return false; //cout << "left="<<left << endl; //cout << "right="<<right << endl; if ( (integer(left)||decimal1(left)) && integer(right) ) return true; return false; } bool isNumeric(char* string) { if (integer(string) || decimal1(string) || decimal2(string)) return true; return false; } };