小练习: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 输出颜色的样式与方法的文章 ...
随机推荐
- JAVA中的反射机制 (转)
反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本 ...
- log4j的配置和使用
日志记录 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器 ...
- Array类拓展方法
var arr=[ {name:'one',sex:'girl',handsome:true}, {name:'two',sex:'girl',handsome:false}, {name:'thr' ...
- Lua 可控下标数组遍历
, , , , , , , , , , , } , , } local j = 1 while i <= #aaa do if bbb[j] == aaa[i] then -- 如果 b下标元素 ...
- Java并发包中线程池的种类和特点介绍
Java并发包提供了包括原子量.并发集合.同步器.可重入锁.线程池等强大工具这里学习一下线程池的种类和特性介绍. 如果每项任务都分配一个线程,当任务特别多的时候,可能会超出系统承载能力.而且线程的创建 ...
- armv7 armv7s arm64 i386 x86_64
开发SDK的同学需要了解这些指令集代表什么. armv7|armv7s|arm64都是ARM处理器的指令集 i386|x86_64 是Mac处理器的指令集 arm64:iPhone7 | iphone ...
- iOS开发之AFNetworking网络编程
众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各 ...
- Python面试题之Python迭代器
要理解迭代器,首先要从字面意思来说. 迭代 重复 下一次重复基于上一次的结果 软件开发就是典型的迭代更新. 讲迭代,我们就先来模拟一下迭代: 现在让我们使用while循环来遍历出一个列表list1 = ...
- snapshot与release
总结自:https://www.jianshu.com/p/084fd2408d9a 这两个概念是用于描述jar包,jar包提供给其他系统作为依赖. 1. snapshot版本代表不稳定.尚处于开发中 ...
- Docker 的一些使用心得
Docker 的使用心得 预备知识·必备· bash(bsd) Net ,ip know hot to search in Google and Baidu 安装 一般找一个不错的网络环境...不然玩 ...