【题解】Leetcode.65.Valid Number (qduoj.162.莫妮提)

题目链接:
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;
}

猜你喜欢

转载自blog.csdn.net/c_duoduo/article/details/73197682