《剑指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次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...
随机推荐
- sublime 格式化代码
将压缩成一行的 css 代码转换成未压缩的格式: 安装sublime下的HTML-CSS-JS Prettify插件,之后右键,选择 html/css/js Prettify 下面的Prettify ...
- ThreadLocal以及内存泄漏
ThreadLocal是什么 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用Thr ...
- 如何理解<base href="<%=basePath%>"
原文链接http://316325524.blog.163.com/blog/static/6652052320111118111620897/ "base href " 今天在写 ...
- linux 更改文件夹所有者
更改“tp5”文件的所有者为”www” chown -R tp5/ www 修改目录及其子目录的用户组为“www” chgrp -R www tp5 同时更改文件或目录的所有者和用户组 chown - ...
- 基于802.11Fuzz技术的研究
转自安全客 关于无线的Fuzz最开始接触了解时,国内基本毛线都搜不到.经过几个月的资料搜集和学习,将大约全网的fuzz资料整理翻译分析并读懂写下,就为填补国内空白,也希望无线爱好者能多多交流. 在各个 ...
- Python字符串解析方法汇总
Python字符串方法解析 1.capitalize 将首字母大写,其余的变成小写 print('text'.capitalize()) print('tExt'.capitalize()) 结果: ...
- JS 中对变量类型判断的几种方式
文章整理搬运,出处不详,如有侵犯,请联系~ 数据类型判断和数据类型转换代码工具 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boo ...
- JS获取今天和上个月的今天
function getLastMonth(){ var now=new Date(); var year = now.getFullYear();//getYear()+1900=getFullYe ...
- js sort方法根据数组中对象的某一个属性值进行排序
sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {name:'zopp',age:0}, {name:'gpp' ...
- UML和模式应用5:细化阶段(6)---操作契约
1.前言 操作契约使用前置和后置条件,描述领域模型里对象的详细变化,作为系统操作的结果. 操作契约可以作为有用的OOA相关的制品. 操作契约可以视为UP用例模型的一部分,它是对用例之处的系统操作的效用 ...