题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值, 但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
解题思路
没看题解的自动机解法,直接一个WA一个WA爬出来的。
题目说的规则完全不清楚,很多规则都是交了之后看样例的出来的
总结了几个可能想不到的点:
1.字符串存在首尾空白需要去掉(首尾空白不影响正确性);比如“ 3.12 ” 是对的。
2.从第一个非空字符开始,出现的空白不可忽略;比如:“ 0. 1 ”是错的。
3.小数不一定左右都有整数部分,比如 “.1” 和“1.” 都是对的。
4.小数点后面不能有正负号,比如“1.+1”和“1.-1” 都是错的。
5.e和E是等价的(不分大小写)。
6.e后面必须是一个整数。
7.不存在表达式的情况,即“1+1”这种是错的。
8.小数点和e出现次数小于2。
9.空串判错。
代码
class Solution { public: struct Word { string type; int val; Word () { type = ""; val = 0; } }; bool isNumber(string s) { int len = s.size(); int p1= 0,p2 = len-1; //首尾去空格 while( p1<len && s[p1] == ' ' ) { p1++; } while( p2>p1 && s[p2] == ' ' ) { p2--; } s = s.substr(p1,p2-p1+1); len = s.size(); if(len == 0) return false; if(len == 1) { return isdigit(s[0]); } vector<Word> words; int se = 0,spo = 0; for(int i=0;i<len;i++) //处理 符号 和 整数 { if( s[i] == '+' || s[i] == '-') { //if( !( i+1<len && ( isdigit(s[i+1]) || s[i+1]=='.') )) return false; Word temp; temp.type = s[i]; words.push_back(temp); } else if( s[i] == 'e' || s[i] == 'E') { Word temp; temp.type = "e"; //temp.val = -1; words.push_back(temp); se++; } else if(s[i] == '.') { Word temp; temp.type = "."; //temp.val = -1; words.push_back(temp); spo++; } else if(isdigit(s[i])) { Word temp; //if( i>0 && s[i-1] == '-' ) temp.val = -1; while( i<len && isdigit(s[i]) ) { i++; } i--; temp.type = "int"; words.push_back(temp); } //else if( s[i] == ' ' ) continue; else return false; } if( se>1 || spo>1 ) return false; int len1 = words.size(); vector<Word> t1; for(int i = 0;i<len1;i++) //处理小数 { if( words[i].type == ".") { // if( i>0 && words[i-1].type == "int" && i<len1-1 && words[i+1].type == "int" && words[i+1].val != -1) if( i>0 && words[i-1].type == "int" && i<len1-1 && words[i+1].type == "int" ) { t1.pop_back(); Word temp; temp.type = "float" ; t1.push_back(temp); i++; } else if( i>0 && words[i-1].type == "int") { t1.pop_back(); Word temp; temp.type = "float" ; t1.push_back(temp); } // else if( i<len1-1 && words[i+1].type == "int" && words[i+1].val != -1) else if( i<len1-1 && words[i+1].type == "int" ) { Word temp; temp.type = "float" ; t1.push_back(temp); i++; } else return false; } else t1.push_back(words[i]); } vector<Word> t2 = t1; t1.clear(); int len2 = t2.size(); for(int i=0;i<len2;i++) //处理+ - { if( t2[i].type=="+" || t2[i].type == "-" ) { if( i<len2-1 && (t2[i+1].type =="int" || t2[i+1].type == "float") ) { Word temp = t2[i+1]; temp.val = t2[i].type == "+" ? 1:-1 ; t1.push_back(temp); i++; } else return false; } else t1.push_back(t2[i]); } for(int i = 0;i<t1.size();i++) //处理e和连续数字 { //cout<<t1[i].type<<' ' ; if(t1[i].type == "e" ) { if ( ! ( i>0 && i<t1.size()-1 && ( t1[i-1].type=="int" || t1[i-1].type=="float" ) && t1[i+1].type == "int") ) return false; } if( i>0 && (t1[i].type == "int" || t1[i].type == "float") && ( t1[i-1].type == "int" || t1[i-1].type == "float" ) ) return false; } //cout<<endl; return true; } };