题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都是,但“12e”、“1a3.14”、“1.2.3、“±5”及“12e+5.4不是 (这个题的描述相当不清楚,很多有悖常理的数字格式也是对的,leetcode上很多人吐槽)
1. 用自动机做
上图只是为了说明自动机处理的原理,下面代码不是按照上面这个图写的。
bool isNumber(const char * str) { if (str == NULL) return false; int state=1; // 初始状态 for(int i = 0; i < strlen(str); ++i){ char c = str[i]; switch (state){ case 1: if(c==' ') state=1; else if(c=='+'||c=='-') state=2; else if(isdigit(c)) state=3; else if(c=='.') state=4; else return false; break; case 2: if(isdigit(c)) state=3; else if(c=='.') state=4; else return false; break; case 3: if(isdigit(c)) state=3; else if(c=='e'||c=='E') state=6; else if(c=='.') state=5; else if(c==' ') state=9; else return false; break; case 4: if(isdigit(c)) state=5; else return false; break; case 5: if(isdigit(c)) state=5; else if(c=='e'||c=='E') state=6; else if(c==' ') state=9; else return false; break; case 6: if(c=='+'||c=='-') state=7; else if(isdigit(c)) state=8; else return false; break; case 7: if(isdigit(c)) state=8; else return false; break; case 8: if(isdigit(c)) state=8; else if(c==' ') state=9; else return false; break; case 9: if(c==' ') state=9; else return false; break; } } return state==3||state==5||state==8||state==9; // 一共有4个正确的结束状态 }