关闭

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

标签: dfa题解leetcodeqduoj算法
458人阅读 评论(0) 收藏 举报
分类:

题目链接:
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;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[BZOJ 1101] POI 2007 Zap · 莫比乌斯 & 分块 超详细题解

初学莫比乌斯反演,翻了大量的题解才搞懂这题,所以决定自己写一个最详细的题解,虽然有些繁琐,但是每一步推导都十分详细。神犇就不要嘲讽我了2333 首先,我们定义 题目即要求 由于d是给定的,所以另 ...
  • ycdfhhc
  • ycdfhhc
  • 2016-02-05 11:12
  • 977

2017 ICPC 西安站现场赛总结&部分题解

关于别墅:别墅很Nice,除了Wifi有点差之外都很棒,晚上还可以去健身房玩耍,早餐特别棒,前台的小哥哥也是很热情!给秦龙打Call! 关于学校:能看得出校方是重视这次比赛的,准备的很充分,给了饭...
  • calabash_boy
  • calabash_boy
  • 2017-10-30 11:01
  • 862

提莫队长蓄势待发.

select * from Tf_fdctze t1 where EXISTS (select id from Tf_fdctze t2 where t2.id ='33' and t1.id=t2....
  • qq_34301871
  • qq_34301871
  • 2017-12-07 18:14
  • 9

HNOI2016 大数(number)<莫队>

题目分析一道典型的莫队。 先预处理出后缀,即f[i]表示i~(n-1) mod p 的值. 但p的值不小,显然不能直接存,加一个离散化。观察题目,发现一串数s(l~r)整除p满足s(l~n-1)%...
  • qq_32739495
  • qq_32739495
  • 2016-04-30 15:04
  • 398

【 题集 】 【kuangbin带你飞】专题六 最小生成树

感觉 差不多了,那题bfs + 最小生成树的,待我以后再补上,感觉最小生成树,应该有一定的理解了吧、、、、     还有 到底是prim 还是 prime 啊 - -# A - Jungle ...
  • xi__long
  • xi__long
  • 2015-01-31 22:10
  • 753

记各种纸尿裤用后感——花王大王MOONY尤妮佳好奇帮宝适等等等

记各种纸尿裤用后感——花王大王MOONY尤妮佳好奇帮宝适等等等   (2014-07-10 21:56:11) 转载▼ 标签:  纸尿裤   花王   ...
  • vbskj
  • vbskj
  • 2016-06-21 11:38
  • 13240

php 踩坑的提莫

注:后续新增的坑,会放前面说明 9、保存源码文件时,注意要使用utf-8无bom签名 之前用Windows的记事本编辑文件,发布到Linux上线后,一直报错:Cannot modify heade...
  • qq_32239417
  • qq_32239417
  • 2016-07-27 12:07
  • 116

莫队算法讲解 (详尽版)

莫队算法我早有耳闻。。可惜前不久才去学习。 但是自己看了看论文,也就1h左右,就能够全部理解了。 也就是说其实这个算法不难。。 好了,让我们进入正题。 我们首先来看一道例题: Des...
  • ThinFatty
  • ThinFatty
  • 2017-05-20 16:25
  • 638

特么的. 终于把 amobbs 的站长阿莫(莫进明)给回骂了一顿.

起因:  如果你居住的地方,要上马PX等高污染的项目,你会怎么做.  鉴于他经常私自修改帖子截图纪念.  真特么没劲. 竟然以封锁别人 ID 作为别人"打不还手骂不还口"的要胁条件.  论坛...
  • KISSMonX
  • KISSMonX
  • 2014-03-31 14:45
  • 25716

树上莫队算法

江湖传闻,莫队算法能够解决一切区间查询问题。这样说来,莫队算法也能够解决一切树上路径查询问题,将树上操作转化为DFS序列上的区间操作即可。当然考虑到,树上路径在DFS序列中的性质,还要会求LCALCA...
  • u012061345
  • u012061345
  • 2017-01-05 16:25
  • 499
    个人资料
    • 访问:205562次
    • 积分:1198
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:2篇
    • 译文:0篇
    • 评论:137条
    文章分类
    最新评论