题目链接:
Leetcode.65.Valid Number
qduoj.162.莫妮提题目大意 :
给出一个字符串,判断其是否是一个数字题目没有给出具体要求的格式,经过多次尝试提交并修正后终于AC
最终通过的程序对数字的判断符合以下几点要求:
- 只考虑整数和小数的十进制情况
- 允许前导0
- 小数允许省略整数或小数部分(不能同时省略)
- 允许科学计数法(大小写e均可)
- 科学记数法e后只能为整数
- 允许正负号(+-)
- 忽略字符串开头和末尾的空格(但中间不能有空格)
思路:
简单的确定性有限自动机
当最终状态为2,3,5或8时返回true
Leetcode.65.Valid Number - AC code:
typedef enum _Type {Sign,E,Dot,Num,No} Type;
inline Type type(char x){
if(x >= '0' && x <= '9') return Num;
if(x == '+' || x == '-') return Sign;
if(x == 'E' || x == 'e') return E;
if(x == '.') return Dot;
return No;
}
bool isNumber(char * s){
// +0.0e+0
// 01235678
// ___4____ 若出现小数点,如果小数点左边没有数字,则进入状态4,否则进入状态3
char *p, *end, state;
for(end = s+strlen(s)-1;*end==' ';end--); //忽略末尾空格
for(p = s;*p==' ';p++); //忽略开头空格
for(state = 0;p <= end;p++){
Type k = type(*p);
if(k == No) return false; // 出现意料之外的字符直接返回false
if(state < 6)
if(k == Num) state = state <3?2:5;
else if(k == Sign)
if(state == 0) state = 1;
else return false;
else if(k == E)
if(state > 1 && state != 4) state = 6;
else return false;
else /*k == Dot */
if (state > 2) return false;
else state = state<2?4:3;
else
if(k == Num) state = 8;
else if(k == Dot || k == E) return false;
else /* k == Sign */
if(state == 6) state = 7;
else return false;
}
return state == 2 || state == 3 || state == 5 || state == 8;
}
qduoj.162.莫妮提- AC code:
#include <stdio.h>
#include <string.h>
enum Type{Sign,E,Dot,Num,No};
inline Type type(char x){
if(x >= '0' && x <= '9') return Num;
if(x == '+' || x == '-') return Sign;
if(x == 'E' || x == 'e') return E;
if(x == '.') return Dot;
return No;
}
bool isNumber(char * s){
// +0.0e+0
// 01235678
// ___4____
char *p, *end, state;
for(end = s+strlen(s)-1;*end==' ';end--);
for(p = s;*p==' ';p++);
for(state = 0;p <= end;p++){
Type k = type(*p);
if(k == No) return false;
if(state < 6)
if(k == Num) state = state <3?2:5;
else if(k == Sign)
if(state == 0) state = 1;
else return false;
else if(k == E)
if(state > 1 && state != 4) state = 6;
else return false;
else /*k == Dot */
if (state > 2) return false;
else state = state<2?4:3;
else
if(k == Num) state = 8;
else if(k == Dot || k == E) return false;
else /* k == Sign */
if(state == 6) state = 7;
else return false;
}
return state == 2 || state == 3 || state == 5 || state == 8;
}
int main(void){
char str[233];
for(;gets(str) != NULL;){
printf("%s - \"%s\"\n", isNumber(str)?"yea":"noo", str);
}
return 0;
}