小练习:vaild number
1.描述
给定字符串,若该字符串表示的是数字,则输出true,否则输出false
2.分析
题目一看感觉不难,做起来却很麻烦,首先是数字的各种表示要知道,然后就是对这些不同形式的数字进行筛选判断。该题目中合法数字的表示形式如下:
± // 前缀有正负号合法
1.2
.
.
1e2
.e2
1e± //以上数字中间不含空格
思路:
总原则,出现非法字符(.e±1234567890及空格之外的)直接false,'.''e'出现两次以上的直接false,有效字段中包含空格的直接false,以'e'开头和以'e''+''-'结尾的直接false
01.首先是缩减字符到有效字段,即一头一尾各一个哨兵,然后相向排除(空格),全都到达合法字符处后结束缩减,例如:
" 12 ee 23 " -> "12 ee 23" // 对于有效字段内部不检查
" e12 " -> false
" 123+ " ->false
02.由上步骤确定的两个首位哨兵位置,对有效字段内部进行排查
03.在有效字段内逐个检查,出现非法字符或者出现空格的直接false,否则对出现的有效字符进行分类检查
3.代码
bool isNumber(string s){
const char* sp = s.c_str();
int eFlag = , dotFlag = , startFlag = , spaceFlag = , numFlag = , dotEFlag = , signFlag = , esignFlag = , signnumFlag = ; //一些标志位
int i = , j = s.length() - ; // 设立哨兵
for (;;) // 压缩头尾,提取有效字段
{
if (sp[i]< || sp[i]>)
{
if (sp[i] != '+'&&sp[i] != '-'&&sp[i] != '.'&& sp[i] != ' ' && sp[i] != 'e' || i>j) //非法字符检查
return false;
}
//-----------------------------------------------------+
if (sp[i] == 'e') // 头--->
return false;
else
{
if (sp[i] == ' ' || sp[i] == '+' || sp[i] == '-')
{
if (signFlag)
return false;
if (sp[i] == '+' || sp[i] == '-')
signFlag = ;
i++;
}
else
startFlag = ;
}
//-----------------------------------------------------+
if (sp[j] == 'e' || sp[j] == '+' || sp[j] == '-') // <---尾
return false;
else
{
if (sp[j] == ' ')
j--;
else if (startFlag)
break;
}
}
//-----------------------------------------------------+
for (; i<j + ; i++) //对有效字段内进行检查
{
if (sp[i]< || sp[i]>)
{
if (sp[i] != '.'&& sp[i] && sp[i] != 'e'&&sp[i] != '+'&&sp[i] != '-') // 排除非法字符
return false;
}
else
{
numFlag = ;
}
//-----------------------------------------------------+
if (sp[i] == 'e') // 为'e'的情况
{
eFlag++;
esignFlag = i; //用来检查 "1e±1"类型
if (i == && dotEFlag) //用来排除".e1"类型
return false;
if (i == (j - ))
dotEFlag = ;
if (eFlag>)
return false;
}
//-----------------------------------------------------+
else if (sp[i] == '.') // 为 '.' 的情况 非法情况是 ".e1""..1"等
{
dotFlag++;
if (i == )
dotEFlag = ;
if (dotEFlag&&i == j) // 用来检查e在.前
return false;
if (eFlag)
return false;
if (dotFlag>)
return false;
}
//-----------------------------------------------------+
else if (sp[i] == '+' || sp[i] == '-') //为'+''-'的情况
{
signnumFlag++;
if (i>esignFlag + ||!eFlag)
return false;
if (signnumFlag>)
return false;
}
}
if (!numFlag)
return false;
return true;
}
经过测试,算法可以使用。
小练习:vaild number的更多相关文章
- 374. Guess Number Higher or Lower
We are playing the Guess Game. The game is as follows: 我们来玩一个游戏,规则如下: I pick a number from 1 to n. Y ...
- 230. 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 题意 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...
- Oracle类型number与PG类型numeric对比和转换策略
Oracle 11g number 任意精度数字类型 http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT3 ...
- 数位DP || Gym 101653R Ramp Number
每一位都大于等于前一位的数叫Ramp Number 给一个数,如果不是Ramp Number输出-1,如果是Ramp Number输出比它小的Ramp Number的个数 只和每一位上的数字有关 #i ...
- java类的封装 继承 多态
1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...
- Flex Array内置排序方法的使用
在Array类中,提供内置的排序方法.排序是在软件开发的过程中,经常遇到的问题.通过这些内置的方法,可以快速轻便的进行排序操作. Array类提供sort方法对Array实例进行排序.sort方法没有 ...
- jsf服务器端验证用户输入
服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...
- <C++Primer>第四版 阅读笔记 第二部分 “容器和算法”
泛型算法中,所谓"泛型(generic)"指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素. 第九章 顺序容器 顺序容器的元素排列次序与元 ...
- python 输出颜色的与样式的方法
上次遇到这个问题就想写下来,其实当时我也不怎么会,老师说这个东西不需要理解,只需要死记硬背,写的多了就记住了,所以今天搜集了几篇文章,加上自己的理解,写下了这篇python 输出颜色的样式与方法的文章 ...
随机推荐
- Teleport Ultra 垃圾代码 tppabs的清理<转>
在使用整站下载软件Teleport Pro或Teleport Ultra下载的离线文件里会包含大量垃圾代码,下载后就需要清除整站下载文件中的冗余代码:tppabs等.这些代码本是Teleport自动添 ...
- spoj1811 LCS - Longest Common Substring
地址:http://www.spoj.com/problems/LCS/ 题面: LCS - Longest Common Substring no tags A string is finite ...
- ZOJ - 2587 Unique Attack (判断最小割是否唯一)
题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...
- (转载)sql注入实战 mysql篇
出现的关键名词有: UNION SELECT load_file hex 为了方便说明我们先创建两个表:hehe和heihei,很明显它们一个拥有2列属性,一个拥有3列属性 ======== ...
- iOS 机智的修改导航栏返回事件
只需要一个在自定义的基类控制器的UIBarButtonItem,在需要的时候继承该类,实现selector方法即可(如果大部分处理都是一样的,只需在基类控制器内实现操作). self.navigati ...
- nginx添加新模块
1.下载模块 git clone https://github.com/agentzh/echo-nginx-module 2.放入指定位置 mv echo-nginx-module-master / ...
- J2Cache 和普通缓存框架有何不同,它解决了什么问题?
不少人看到 J2Cache 第一眼时,会认为这就是一个普普通通的缓存框架,和例如 Ehcache.Caffeine .Spring Cache 之类的项目没什么区别,无非是造了一个新的轮子而已.事实上 ...
- 20145307JAVA学习期末总结
20145307<Java程序设计>课程总结 每周读书笔记链接汇总 20145307 <Java程序设计>第一周学习总结:http://www.cnblogs.com/Jcle ...
- 20145314郑凯杰 《Java程序设计》第7周学习总结
20145314郑凯杰 <Java程序设计>第7周学习总结 教材学习内容总结 首先放上代码托管图片和本地代码图片: 插图4: 插图5: 插图6: 第十三章 时间与日期 13.1 认识时间与 ...
- excel省市区三级分类级联
前言:同事正好需要一个这样的地址类型给用户使用下载模板,改好地址再导入,这样就不会出现地址不匹配问题.所以就自己也整理了一套,以备不时之需. 效果展示: 图一:省级 图二:市级 图三:区级 图四:各乡 ...