剑指 Offer 20. 表示数值的字符串(暴力)
思路:暴力枚举的高级名字:有限状态自动机。
判断步骤:
1.首先把开头空格判断掉。
2.如果当前字符为 e e e或 E E E
它的前面不能有 . . . 它的前面必须有数字。
然后将符号,小数点,数字状态置为 0 0 0.
3.如果当前字符为符号。
它的前面不能有数字,小数点,符号。
然后将符号置为 1 1 1。
4.如果当前字符为小数点。
它的前面不能有小数点和 e e e。
然后将小数点置为 1 1 1。
5.如果是空格则跳出。
然后判断是否为末尾连续的空格。
6.最后特判当前是否遍历完了并且有数字出现过。
几个注意的点: e e e后面不能有小数, . . .前面可以没数字,符号不能连续出现多次,小数点最多出现1次。
class Solution {
public:
bool isNumber(string s) {
int n = s.size(),id = 0;
bool jg_dot = false,jg_e = false,jg_sign = false,jg_num = false;
while(id<n&&s[id]==' ') id++;
while(id<n){
if(isdigit(s[id]))
jg_num = true;
else if(tolower(s[id])=='e'){
if(jg_e||!jg_num) return false;
jg_e=true;
jg_sign=jg_dot=jg_num=false;
}else if(s[id]=='+' || s[id]=='-'){
if(jg_sign||jg_num||jg_dot) return false;
jg_sign= true;
}else if(s[id]=='.'){
if(jg_dot||jg_e) return false;
jg_dot = true;
}else if(s[id]==' ')
break;
else return false;
++id;
}
while(id<n&&s[id]==' ') id++;
return jg_num&&id==n;
}
};