# 【题解】Leetcode.65.Valid Number （qduoj.162.莫妮提）

458人阅读 评论(0)

- 只考虑整数和小数的十进制情况
- 允许前导0
- 小数允许省略整数或小数部分（不能同时省略）
- 允许科学计数法（大小写e均可）
- 科学记数法e后只能为整数
- 允许正负号（+-）
- 忽略字符串开头和末尾的空格（但中间不能有空格）

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;
}
0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：205562次
• 积分：1198
• 等级：
• 排名：千里之外
• 原创：31篇
• 转载：2篇
• 译文：0篇
• 评论：137条
文章分类
评论排行
最新评论