本文给出一种可以AC的Valid Number的定义,算法的有限状态机及源码。

1 Valid Number的定义(参考浮点数语法):

Name

Regular Expression

space

' ' | '\t'

sign

[+-]

digit

[0-9]+

exp

'e'

dot

'.'

seq (digit sequence)

digit+

exponent

exp sign? seq

significand

seq

seq dot

seq dot seq

dot seq

valid_number

space* sign? significand exponent? space*

2 算法的有限状态机

3 源码

#include <stdbool.h>#ifndef SYMBOL_CASE
#define SYMBOL_CASE(symbol) case symbol:
#endif#ifndef SPACE_CASE
#define SPACE_CASE \SYMBOL_CASE(' ') \SYMBOL_CASE('\t')
#endif#ifndef DIGIT_CASE
#define DIGIT_CASE \SYMBOL_CASE('0') \SYMBOL_CASE('1') \SYMBOL_CASE('2') \SYMBOL_CASE('3') \SYMBOL_CASE('4') \SYMBOL_CASE('5') \SYMBOL_CASE('6') \SYMBOL_CASE('7') \SYMBOL_CASE('8') \SYMBOL_CASE('9')
#endif#ifndef SIGN_CASE
#define SIGN_CASE  \SYMBOL_CASE('+') \SYMBOL_CASE('-')
#endif#ifndef DOT_CASE
#define DOT_CASE  \SYMBOL_CASE('.')
#endif#ifndef EXP_CASE
#define EXP_CASE  \SYMBOL_CASE('e')
#endif#ifndef FINAL_CASE
#define FINAL_CASE  \SYMBOL_CASE('\0')
#endif#ifndef STATUS_SUCCESS
#define STATUS_SUCCESS 16
#endif#ifndef STATUS_FAILURE
#define STATUS_FAILURE -1
#endif#ifndef DEFINE_NEXT_STATUS_FUNC_HEAD
#define DEFINE_NEXT_STATUS_FUNC_HEAD(num)          \int next_status_##num(char c)                  \{                                              \int status = STATUS_FAILURE;               \\switch (c)
#endif#ifndef DEFINE_NEXT_STATUS_FUNC_TAIL
#define DEFINE_NEXT_STATUS_FUNC_TAIL               \return status;                                 \
}
#endif#ifndef INVOKE_NEXT_STATUS_FUNC
#define INVOKE_NEXT_STATUS_FUNC(num)               \case num:                                      \status = next_status_##num(c);                 \break;
#endif#ifndef PROCESS_CASE
#define PROCESS_CASE(case_statement, status_code)  \case_statement                                 \status = status_code;                          \break;
#endif#ifndef PROCESS_CASE_DEFAULT
#define PROCESS_CASE_DEFAULT                       \default:                                       \break;
#endifDEFINE_NEXT_STATUS_FUNC_HEAD(0)
{PROCESS_CASE(SPACE_CASE, 0)PROCESS_CASE(SIGN_CASE, 1)PROCESS_CASE(DIGIT_CASE, 2)PROCESS_CASE(DOT_CASE, 3)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(1)
{PROCESS_CASE(DIGIT_CASE, 2)PROCESS_CASE(DOT_CASE, 3)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(2)
{PROCESS_CASE(DIGIT_CASE, 2)PROCESS_CASE(DOT_CASE, 4)PROCESS_CASE(EXP_CASE, 5)PROCESS_CASE(SPACE_CASE, 8)PROCESS_CASE(FINAL_CASE, STATUS_SUCCESS)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(3)
{PROCESS_CASE(DIGIT_CASE, 4)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(4)
{PROCESS_CASE(DIGIT_CASE, 4)PROCESS_CASE(EXP_CASE, 5)PROCESS_CASE(SPACE_CASE, 8)PROCESS_CASE(FINAL_CASE, STATUS_SUCCESS)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(5)
{PROCESS_CASE(SIGN_CASE, 6)PROCESS_CASE(DIGIT_CASE, 7)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(6)
{PROCESS_CASE(DIGIT_CASE, 7)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(7)
{PROCESS_CASE(DIGIT_CASE, 7)PROCESS_CASE(SPACE_CASE, 8)PROCESS_CASE(FINAL_CASE, STATUS_SUCCESS)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILDEFINE_NEXT_STATUS_FUNC_HEAD(8)
{PROCESS_CASE(SPACE_CASE, 8)PROCESS_CASE(FINAL_CASE, STATUS_SUCCESS)PROCESS_CASE_DEFAULT
}
DEFINE_NEXT_STATUS_FUNC_TAILbool isNumber(char* s) {int status = 0;char c;while (status != STATUS_FAILURE && status != STATUS_SUCCESS){c = *(s++);switch (status){INVOKE_NEXT_STATUS_FUNC(0)INVOKE_NEXT_STATUS_FUNC(1)INVOKE_NEXT_STATUS_FUNC(2)INVOKE_NEXT_STATUS_FUNC(3)INVOKE_NEXT_STATUS_FUNC(4)INVOKE_NEXT_STATUS_FUNC(5)INVOKE_NEXT_STATUS_FUNC(6)INVOKE_NEXT_STATUS_FUNC(7)INVOKE_NEXT_STATUS_FUNC(8)default:break;}}return status == STATUS_SUCCESS;
}

leetcode 65. Valid Number相关推荐

  1. 【To Do! 重点 正则表达式】LeetCode 65. Valid Number

    LeetCode 65. Valid Number 本博客转载自:[1]http://www.cnblogs.com/yuzhangcmu/p/4060348.html [2]https://blog ...

  2. 65. Valid Number

    description: 看给定的数字是否是合法数字 Note: Example: answer: class Solution { public:bool isNumber(string s) {i ...

  3. Valid Number

    Valid Number 题解 题目描述 即判断某个字符串是否合法的数字表达式. 如: 2e10,合法. 75.0.,非法. 0e,非法. 0.1 ,合法. 题解 基于规则与状态判断.可利用二维数组模 ...

  4. LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...

  5. 【整数转字符串】LeetCode 9. Palindrome Number

    LeetCode 9. Palindrome Number Solution1: 不利用字符串 class Solution { public:bool isPalindrome(int x) {if ...

  6. 【回文串2】LeetCode 9. Palindrome Number

    LeetCode 9. Palindrome Number Solution1:我的答案 思路一:转化为字符串 class Solution { public:bool isPalindrome(in ...

  7. 【回文串14】LeetCode 680. Valid Palindrome II

    LeetCode 680. Valid Palindrome II Solution1:我的答案 复杂度是O(n)O(n)O(n),不算好啊.. 注意:对于c++中string对象常用的insert( ...

  8. 【回文串3】LeetCode 125. Valid Palindrome

    LeetCode 125. Valid Palindrome Solution1:我的答案 复杂度为O(n)O(n)O(n),写法不是很简练啊. class Solution { public:boo ...

  9. 【?异或】LeetCode 260. Single Number III

    LeetCode 260. Single Number III Solution1: 博客转载自:http://www.cnblogs.com/grandyang/p/4741122.html 这道题 ...

  10. 【异或】LeetCode 137. Single Number II

    LeetCode 137. Single Number II Solution1:不会做,抄的 博客转载自:http://www.cnblogs.com/grandyang/p/4263927.htm ...

最新文章

  1. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.11. 外部数据
  2. pptv网络电视android,PP视频(原聚力视频)
  3. apache 不执行PHP,显示代码
  4. 使用抽象等设计工具创建一个稳固的核心机制
  5. 2021长郡浏阳中学高考成绩查询,2021长沙市高中排名一览表
  6. 通过webpack配置vue项目页面title
  7. AAAI 2018论文解读 | 基于文档级问答任务的新注意力模型
  8. Ubuntu系统opencv4.4 opencv_contribute安装常见问题
  9. 如何在Ubuntu 16.04上使用MySQL 5.6配置Galera集群
  10. web 自动化测试 selenium基础到应用(目录)
  11. 真空压力变送器怎么样零点标定_对于变送器你知道多少?
  12. 教育部:“改薄”工程实施中预防拖欠农民工工资
  13. matlab求最大公约数和最小公倍数
  14. WinServer2003秘笈放送
  15. linux 编译 pascal,免费开源的Pascal编译器 GNU Pascal
  16. 树莓派是什么?能干什么?
  17. 数据挖掘算法和实践(三):朴素贝叶斯(mushrooms蘑菇数据集)
  18. unbuntu20.04安装mysql5.7
  19. Riverbed’s Modeler Academic
  20. 【数据结构】带动画显示过程的递归求解迷宫问题

热门文章

  1. Eclipse下创建Hibernate工程
  2. redis详解_java 从零开始手写 redis(14)redis渐进式rehash详解
  3. 怎么用python找因子_python找出因数与质因数的方法
  4. 安装高版本的java_运行“需要Java 11或更高版本”的Visual Studio代码。请下载并安装最新的JDK”...
  5. android wakelock权限,android - 当我使用PowerManager.WakeLock与AlaramManager android时的权限异常 - 堆栈内存溢出...
  6. java object转泛型_Java 反射:框架设计的灵魂
  7. python输出重定向_使用Python子进程重定向标准输出到标准输入...
  8. antdesignpro 重定向到登录页面_Bluehost 域名解析和 301 重定向设置
  9. eagle8.6 linux 补丁,Ubuntu 12.04无法安装Eagle-6.x 解决方法
  10. 统计123出现次数_Java字符串03-统计大小写字母出现的次数