leetcode 65. Valid Number
本文给出一种可以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相关推荐
- 【To Do! 重点 正则表达式】LeetCode 65. Valid Number
LeetCode 65. Valid Number 本博客转载自:[1]http://www.cnblogs.com/yuzhangcmu/p/4060348.html [2]https://blog ...
- 65. Valid Number
description: 看给定的数字是否是合法数字 Note: Example: answer: class Solution { public:bool isNumber(string s) {i ...
- Valid Number
Valid Number 题解 题目描述 即判断某个字符串是否合法的数字表达式. 如: 2e10,合法. 75.0.,非法. 0e,非法. 0.1 ,合法. 题解 基于规则与状态判断.可利用二维数组模 ...
- LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字
2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...
- 【整数转字符串】LeetCode 9. Palindrome Number
LeetCode 9. Palindrome Number Solution1: 不利用字符串 class Solution { public:bool isPalindrome(int x) {if ...
- 【回文串2】LeetCode 9. Palindrome Number
LeetCode 9. Palindrome Number Solution1:我的答案 思路一:转化为字符串 class Solution { public:bool isPalindrome(in ...
- 【回文串14】LeetCode 680. Valid Palindrome II
LeetCode 680. Valid Palindrome II Solution1:我的答案 复杂度是O(n)O(n)O(n),不算好啊.. 注意:对于c++中string对象常用的insert( ...
- 【回文串3】LeetCode 125. Valid Palindrome
LeetCode 125. Valid Palindrome Solution1:我的答案 复杂度为O(n)O(n)O(n),写法不是很简练啊. class Solution { public:boo ...
- 【?异或】LeetCode 260. Single Number III
LeetCode 260. Single Number III Solution1: 博客转载自:http://www.cnblogs.com/grandyang/p/4741122.html 这道题 ...
- 【异或】LeetCode 137. Single Number II
LeetCode 137. Single Number II Solution1:不会做,抄的 博客转载自:http://www.cnblogs.com/grandyang/p/4263927.htm ...
最新文章
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.11. 外部数据
- pptv网络电视android,PP视频(原聚力视频)
- apache 不执行PHP,显示代码
- 使用抽象等设计工具创建一个稳固的核心机制
- 2021长郡浏阳中学高考成绩查询,2021长沙市高中排名一览表
- 通过webpack配置vue项目页面title
- AAAI 2018论文解读 | 基于文档级问答任务的新注意力模型
- Ubuntu系统opencv4.4 opencv_contribute安装常见问题
- 如何在Ubuntu 16.04上使用MySQL 5.6配置Galera集群
- web 自动化测试 selenium基础到应用(目录)
- 真空压力变送器怎么样零点标定_对于变送器你知道多少?
- 教育部:“改薄”工程实施中预防拖欠农民工工资
- matlab求最大公约数和最小公倍数
- WinServer2003秘笈放送
- linux 编译 pascal,免费开源的Pascal编译器 GNU Pascal
- 树莓派是什么?能干什么?
- 数据挖掘算法和实践(三):朴素贝叶斯(mushrooms蘑菇数据集)
- unbuntu20.04安装mysql5.7
- Riverbed’s Modeler Academic
- 【数据结构】带动画显示过程的递归求解迷宫问题
热门文章
- Eclipse下创建Hibernate工程
- redis详解_java 从零开始手写 redis(14)redis渐进式rehash详解
- 怎么用python找因子_python找出因数与质因数的方法
- 安装高版本的java_运行“需要Java 11或更高版本”的Visual Studio代码。请下载并安装最新的JDK”...
- android wakelock权限,android - 当我使用PowerManager.WakeLock与AlaramManager android时的权限异常 - 堆栈内存溢出...
- java object转泛型_Java 反射:框架设计的灵魂
- python输出重定向_使用Python子进程重定向标准输出到标准输入...
- antdesignpro 重定向到登录页面_Bluehost 域名解析和 301 重定向设置
- eagle8.6 linux 补丁,Ubuntu 12.04无法安装Eagle-6.x 解决方法
- 统计123出现次数_Java字符串03-统计大小写字母出现的次数