表示数值的字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解题思路:
关键点是分析e存在的情况下前面数字的合法性和后面数字的合法性。记录e前面数字的值,记录e后面数字的值,同时在记录时判断合法性。
class Solution { public: bool isNumeric(char* string) { //e/E出现的位置 int e = -1; //为了方便描述,下面所说e代表e/E //e前面加减号的个数 int epreplus = 0; //e后面加减号的个数 int ebehplus = 0; //e前面逗号的个数 int epredot = 0; //e后面逗号的个数 int ebehdot = 0; //e前面整数部分的值 //e前面小数部分的值 double eprev1 = 0.0, eprev2 = 0.0; //e前面逗号的位置 int epredotpos = -1; //e前面的值 int ebehv = 0; for(int i = 0 ; string[i] != '\0' ; i++){ if(string[i] == 'E' || string[i] == 'e'){ //出现两次e if(e != -1){ // cout<<"c1"<<endl; return false; } e = i; //非法字符判断 }else if(string[i] != '.' && string[i] != '+' && string[i] != '-' && (!(string[i]>='0' && string[i] <= '9'))){ // cout<<"c2"<<endl; return false; }
//逗号次数判断 if(string[i] == '.'){ if(e == -1){ epredot ++; //如果e前面逗号大于1个 if(epredot>1) { // cout<<"c3"<<endl; return false; } }else{ //e后面出现逗号 // cout<<"c4"<<endl; return false; } }
//加减号次数判断 if(string[i] == '+' || string[i] == '-'){ if(e != -1){ epreplus++; //e前面加减号出现次数大于1 if(epreplus>1){ // cout<<"c5"<<endl; return false; } }else{ ebehplus++; //e后面加减号出现次数大于1 if(ebehplus >1){ // cout<<"c6"<<endl; return false; } } } if(string[i] != 'e' && string[i] != 'E'){ if(e == -1){ if(string[i] == '-' || string[i] == '+'){ //e前面的逗号必须是第一个字符 if(i != 0){ // cout<<"c7"<<endl; return false; } } if(string[i] == '.'){ epredotpos = i; }else if(string[i] >= '0' && string[i] <= '9'){ if(epredotpos == -1){ //e前面整数部分 eprev1 = eprev1 * 10 + string[i]-'0'; }else{ //e前面小数部分 eprev2 = eprev2 + (string[i]-'0')/pow(10, i-epredotpos); } } }else{ if(string[i] == '+' || string[i] == '-') { //e后面正负号必须紧邻e if(i-e != 1){ // cout<<"c8"<<endl; return false; } } if(string[i] >= '0' && string[i] <= '9'){ // cout<<"string[i]="<<string[i]<<endl; //e后面的值 ebehv = ebehv*10 + string[i]-'0'; } } } } double eprev = eprev1+eprev2; //cout<<"eprev="<< eprev<<endl; //存在e且e前面的值为0或小于1 if(e != -1 && (eprev == 0 || eprev < 1)){ // cout<<"c10"<<endl; return false; } //存在e且e后面的值等于0 if(e != -1 && ebehv == 0){ //cout<<"c11"<<endl; return false; } return true; } };
学学学 练练练 刷刷刷