您的位置:首页 > 其它

LeetCode --- Valid Number

2015-03-15 22:21 267 查看
Validate if a given string is numeric.

Some examples:

"0"
=>
true


" 0.1 "
=>
true


"abc"
=>
false


"1 a"
=>
false


"2e10"
=>
true


这是题目地址
我是用自动机解决的,需要吐槽的是,LeetCode给的测试用例太全了,我的状态转移改了几次才好:

/**
 * 
 * 基于自动机的数字验证
 * base on Finite Automata Machine ;
 */

bool isNumber(char *s) {
 
    int state = 0;
    
    while(*(s) == ' ') s++ ;
    
    if(*s == '+' || *s == '-')
        s++;
    
    if(*s == '.' && *(s + 1) == '\0')
        return false ;
    else if(*s == '.' && *(s + 1) == ' ')
        return false ;
    else if(*s == '.' && (*(s + 1) == 'E' || *(s + 1) == 'e'))
        return false ;
    
    while(*s != '\0')
    {
         switch(state){
             
            case 0 :    if(isdigit(*s)) {state = 1;  s++;}
                        else if(*s == '.') {state = 2 ; s++;}
                        else if(*s == ' ') {state = 7;s++;}
                        else goto Exit ;
                        break ;
            case 1 :    if(isdigit(*s)) {state =1; s++ ;}
                        else if (*s == '.') {state =2 ; s++;}
                        else if (*s == 'E' || *s == 'e') {state =4 ; s++;}
                        else if(*s == ' ') {state = 7;s++;}
                        else goto Exit ;
                        break;
            case 2 :    if(isdigit(*s)) {state =3 ;s++;}
                        else if (*s == 'E' || *s == 'e') {state =4 ; s++;}
                        else if(*s == ' ') {state = 7;s++;}
                        else goto Exit ;
                        break;
            case 3 :    if(isdigit(*s)) {state = 3 ; s++;}
                        else if(*s == 'E' || *s == 'e') {state =4 ; s++;}
                        else if(*s == ' ') {state = 7;s++;}
                        else goto Exit;
                        break;
            case 4 :    if(isdigit(*s)) {state = 6 ; s++;}
                        else if(*s == '+' || *s == '-') {state = 5; s++;}
                        else goto Exit;
                        break;
            case 5 :    if(isdigit(*s)) {state = 6 ; s++;}
                        else if(*s == ' ') {state = 7;s++;}
                        else goto Exit;
                        break;
            case 6 :    if(isdigit(*s)) {state = 6 ; s++;}
                        else if(*s == ' ') {state = 7;s++;}
                        else goto Exit;
                        break;
            case 7 :    if(*s != ' ')  goto Exit ;
                        else    s++;
                        break ;
         }  
    }
    
    if(state == 0 ||  state == 4 || state == 5 )
        return false ;
    
    return true;
    
    Exit : return false ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: