《剑指offer》-表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
题目是要判断一个表达式是否满足预设规则。其实就是正则匹配。正则匹配的原理,编译原理课上有讲过,用NFA/DFA来判定即可。
class Solution {
private:
enum STATUS{ END = 0, START, SIGNED1, INTEGER, POINT, FLOAT, EXPONENT, SIGNED2, SCIENCE };
STATUS dfa[256][9] = { END };
public:
Solution(){
for (int i = 0; i < 256; ++i){
for (int j = 0; j < 9; ++j){
dfa[i][j] = END;
}
}
initDFA();
}
bool isNumeric(char* string){
STATUS current = START;
while (*string && current != END){
current = DFA(current, *string);
++string;
}
switch (current){
case INTEGER:
case FLOAT:
case SCIENCE:
return true;
}
return false;
}
private:
void initDFA(){
char d = '0';
// 1. START 变迁
dfa['+'][START] = SIGNED1;
dfa['-'][START] = SIGNED1;
dfa['.'][START] = POINT;
for (d = '0'; d <= '9'; ++d){
dfa[d][START] = INTEGER;
}
// 2. SIGNED1 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][SIGNED1] = INTEGER;
}
dfa['.'][SIGNED1] = POINT;
// 3. INTEGER 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][INTEGER] = INTEGER;
}
dfa['.'][INTEGER] = FLOAT;
dfa['E'][INTEGER] = EXPONENT;
dfa['e'][INTEGER] = EXPONENT;
// 4. POINT 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][POINT] = FLOAT;
}
// 5. FLOAT 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][FLOAT] = FLOAT;
}
dfa['E'][FLOAT] = EXPONENT;
dfa['e'][FLOAT] = EXPONENT;
// 6. EXPONENT 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][EXPONENT] = SCIENCE;
}
dfa['+'][EXPONENT] = SIGNED2;
dfa['-'][EXPONENT] = SIGNED2;
// 7. SIGNED2 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][SIGNED2] = SCIENCE;
}
// 8. SCIENCE 变迁
for (d = '0'; d <= '9'; ++d){
dfa[d][SCIENCE] = SCIENCE;
}
// 其余情况均变迁到 END
}
STATUS DFA(STATUS current, char input){
STATUS ret = START;
return dfa[input][current];
}
};
《剑指offer》-表示数值的字符串的更多相关文章
- 剑指Offer——表示数值的字符串
题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...
- 《剑指offer》 数值的整数次方
本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...
- 剑指offer 1,输入一个字符串,将字符串的空格替换成%20
剑指offer 1,输入一个字符串,将字符串的空格替换成%20 function replaceSpace(str){ return str.replace(/\s/g,"% ...
- 剑指Offer - 九度1369 - 字符串的排列
剑指Offer - 九度1369 - 字符串的排列2014-02-05 21:12 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所 ...
- 【剑指Offer】数值的整数次方 解题报告(Python)
[剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 【剑指Offer】左旋转字符串 解题报告(Python)
[剑指Offer]左旋转字符串 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 剑指offer(27)字符串的排列
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入 ...
- 【Java】 剑指offer(15) 数值的整数次方
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 实现函数double Power(double base, int ...
- 【Java】 剑指offer(58-2) 左旋转字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部 ...
- (3)剑指Offer之数值的整数次方和调整数组元素顺序
一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...
随机推荐
- C++ STL sort()函数用法
C++STL提供的在里的排序函数,有以下两种形式 此外还提供有稳定排序版本stable_sort(),用法类似. 第一种形式: template <class RandomAccessItera ...
- JAVA实现具有迭代器的线性表(单链表)
一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...
- Javaweb学习笔记——(四)——————JavaScript基础&DOM目录
1.案例一:在末尾添加节点 第一个:获取到ul标签 第二部:创建li标签 document.createElement("标签名称")方法 第三步:创建文本 document.cr ...
- c# 网络验证
#region 检查网络连接 static bool exitResult = false; /// <summary> /// 检查网络连接 /// add by wlzhang 201 ...
- [C++]C++与C头文件辨析(比较)
C++/C头文件辨析 C++标准库 C标准库 C++标准模板库 ios vector iomanip deque sstream list fstream map set ...
- node版本管理工具nvm安装以及使用
curl命令安装 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash 或者 使用wg ...
- Java类的5个加载步骤
类加载的五个过程分为: 加载 验证 准备 解析 初始化 1 加载 完成三件事: 通过类的全限定名来获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成 ...
- python的__mro__与__slot__
class A(object): def __init__(self): print ' -> Enter A' print ' <- Leave A' class B(A): def _ ...
- Linux常用命令(一)查看日志
当日志文件存储很大时,需要Linux命令查看: Log 在目录 /var/log/ 下 常用命令: tail head grep sed cat tac https://blog.csdn.net ...
- nginx入门三
负载均衡 upstream upstream app_server { server 127.0.0.1:8000; server 192.168.2.134:80; server 47.xx.xx. ...