请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

题目是要判断一个表达式是否满足预设规则。其实就是正则匹配。正则匹配的原理,编译原理课上有讲过,用NFA/DFA来判定即可。


  1. class Solution {
  2. private:
  3. enum STATUS{ END = 0, START, SIGNED1, INTEGER, POINT, FLOAT, EXPONENT, SIGNED2, SCIENCE };
  4. STATUS dfa[256][9] = { END };
  5. public:
  6. Solution(){
  7. for (int i = 0; i < 256; ++i){
  8. for (int j = 0; j < 9; ++j){
  9. dfa[i][j] = END;
  10. }
  11. }
  12. initDFA();
  13. }
  14. bool isNumeric(char* string){
  15. STATUS current = START;
  16. while (*string && current != END){
  17. current = DFA(current, *string);
  18. ++string;
  19. }
  20. switch (current){
  21. case INTEGER:
  22. case FLOAT:
  23. case SCIENCE:
  24. return true;
  25. }
  26. return false;
  27. }
  28. private:
  29. void initDFA(){
  30. char d = '0';
  31. // 1. START 变迁
  32. dfa['+'][START] = SIGNED1;
  33. dfa['-'][START] = SIGNED1;
  34. dfa['.'][START] = POINT;
  35. for (d = '0'; d <= '9'; ++d){
  36. dfa[d][START] = INTEGER;
  37. }
  38. // 2. SIGNED1 变迁
  39. for (d = '0'; d <= '9'; ++d){
  40. dfa[d][SIGNED1] = INTEGER;
  41. }
  42. dfa['.'][SIGNED1] = POINT;
  43. // 3. INTEGER 变迁
  44. for (d = '0'; d <= '9'; ++d){
  45. dfa[d][INTEGER] = INTEGER;
  46. }
  47. dfa['.'][INTEGER] = FLOAT;
  48. dfa['E'][INTEGER] = EXPONENT;
  49. dfa['e'][INTEGER] = EXPONENT;
  50. // 4. POINT 变迁
  51. for (d = '0'; d <= '9'; ++d){
  52. dfa[d][POINT] = FLOAT;
  53. }
  54. // 5. FLOAT 变迁
  55. for (d = '0'; d <= '9'; ++d){
  56. dfa[d][FLOAT] = FLOAT;
  57. }
  58. dfa['E'][FLOAT] = EXPONENT;
  59. dfa['e'][FLOAT] = EXPONENT;
  60. // 6. EXPONENT 变迁
  61. for (d = '0'; d <= '9'; ++d){
  62. dfa[d][EXPONENT] = SCIENCE;
  63. }
  64. dfa['+'][EXPONENT] = SIGNED2;
  65. dfa['-'][EXPONENT] = SIGNED2;
  66. // 7. SIGNED2 变迁
  67. for (d = '0'; d <= '9'; ++d){
  68. dfa[d][SIGNED2] = SCIENCE;
  69. }
  70. // 8. SCIENCE 变迁
  71. for (d = '0'; d <= '9'; ++d){
  72. dfa[d][SCIENCE] = SCIENCE;
  73. }
  74. // 其余情况均变迁到 END
  75. }
  76. STATUS DFA(STATUS current, char input){
  77. STATUS ret = START;
  78. return dfa[input][current];
  79. }
  80. };

《剑指offer》-表示数值的字符串的更多相关文章

  1. 剑指Offer——表示数值的字符串

    题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...

  2. 《剑指offer》 数值的整数次方

    本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...

  3. 剑指offer 1,输入一个字符串,将字符串的空格替换成%20

    剑指offer 1,输入一个字符串,将字符串的空格替换成%20    function replaceSpace(str){      return str.replace(/\s/g,"% ...

  4. 剑指Offer - 九度1369 - 字符串的排列

    剑指Offer - 九度1369 - 字符串的排列2014-02-05 21:12 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所 ...

  5. 【剑指Offer】数值的整数次方 解题报告(Python)

    [剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  6. 【剑指Offer】左旋转字符串 解题报告(Python)

    [剑指Offer]左旋转字符串 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  7. 剑指offer(27)字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入 ...

  8. 【Java】 剑指offer(15) 数值的整数次方

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 实现函数double Power(double base, int ...

  9. 【Java】 剑指offer(58-2) 左旋转字符串

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部 ...

  10. (3)剑指Offer之数值的整数次方和调整数组元素顺序

    一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...

随机推荐

  1. CM记录-HDFS用户组映射

    hdfs可以将linux用户映射为hdfs用户,也就是说,你当前操作hdfs的用户身份就是你当前登录的linux用户 usermod -a -G hive admin  ---将admin用户加到hi ...

  2. Netty入门(4) - 附带的ChannelHandler和Codec

    使用SSL/TLS创建安全的Netty程序 Java提供了抽象的SslContext和SslEngine,实际上SslContext可以用来获取SslEngine来进行加密和解密.Netty拓展了Ja ...

  3. Java EE之Form的get与post方法

    Form表单中method="post/get'的区别 Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生 ...

  4. HKE和他的小朋友(矩乘快速幂)

    题面: 题目背景: HKE带着\(n\)个小朋友做游戏 题目描述: 现在有n个座位编号为\(1\)至\(n\),这些小朋友也编号\(1\)至\(n\).一开始所有小朋友都坐在相应的座位上.HKE的游戏 ...

  5. Nginx实战之让用户通过用户名密码认证访问web站点

    1.Nginx实战之让用户通过用户名密码认证访问web站点 [root@master ~]# vim /usr/local/nginx/conf/extra/www.conf server { lis ...

  6. ubuntu 14.04 软件中心闪退解决方案

    法一: gksudo gedit /usr/share/software-center/softwarecenter/ui/gtk3/views/lobbyview.py 注释下面这句话(注释使用#号 ...

  7. 集群下Dubbo负载均衡配置

    在集群负载均衡时,Dubbo提供了4种均衡策略,默认为Random(随机调用) 负载均衡策略: 1).Random LoadBalance(随机,按照权重的设置随机概率) 2).RoundRobin  ...

  8. 【网络编程4】网络编程基础-ARP响应(ARP欺骗之中间人攻击)

    arp欺骗->arp响应 ARP 缓存中毒(ARP欺骗) arp传送原理在于主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址:收到返回消 ...

  9. fnmatch模块的使用

    fnmatch模块的使用 此模块的主要作用是文件名称的匹配,并且匹配的模式使用的unix shell风格.fnmatch比较简单就4个方法分别是:fnmatch,fnmatchcase,filter, ...

  10. Nginx软件优化【转】

    转自 Nginx软件优化 - 惨绿少年 - 博客园 Nginx软件优化 - 惨绿少年 - 博客园 https://www.cnblogs.com/clsn/p/8484559.html 1.1 Ngi ...