1.if-else判断(最简单做法,看大佬题解下面的力扣评论区一位老哥的做法,终于过了!!!
class Solution {
public:
//几经曲折,什么有限状态自动机,什么正则表达式,都不如我直接判断更容易理解
bool isNumber(string s) {
if(s.length()==0) return false; //空
bool isnum=false,isdot=false,ise=false;
int index=0,fisrtstr=0,length=s.length();
while(index<length && s[index]==' '){ //首空格
index++;
}
fisrtstr=index;
while(index<length){
if(s[index]>='0'&&s[index]<='9') isnum=true;
else if(s[index]=='.'){
if(isdot || ise) return false;
isdot=true;
}
else if(s[index]=='e' || s[index]=='E'){
if(!isnum||ise) return false;
ise=true;
isnum=false;
}
else if(s[index]=='+' || s[index]=='-'){
if(index!=fisrtstr && s[index-1]!='e' && s[index-1]!='E') return false;
}
else if(s[index]==' ') break;
else return false;
index++;
}
while(index<length && s[index]==' '){ //尾空格
index++;
}
return isnum && index==length;
}
};
2.有限状态自动机(思路理解了,因c++ map数组不会写而放弃这道题的解法
按照给出的规则,确定状态转移图,根据状态转移图编写代码。
参考大佬的解答和图:
面试题20. 表示数值的字符串(有限状态自动机,清晰图解)
3.虽然学习了正则表达式,正则表达式相当于一个DFA或者NFA,但是放这题用c++正则表达式求解超时了
return regex_match(s,regex("\\s*[+-]?((\\d+)|(\\d*\\.\\d+)|(\\d+\\.\\d*))([eE][+-]?\\d+)?\\s*"));
学习正则表达式的时候参考了以下内容:
正则表达式 - 语法
正则表达式里的底层原理是什么
C++正则表达式
藏在正则表达式里的陷阱
一个由正则表达式引发的血案
关于正则表达式里含有空格的问题
正则表达式测试网站