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的更多相关文章

  1. 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 ...

  2. 230. 二叉搜索树中第K小的元素

    230. 二叉搜索树中第K小的元素 题意 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...

  3. Oracle类型number与PG类型numeric对比和转换策略

    Oracle 11g number 任意精度数字类型 http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT3 ...

  4. 数位DP || Gym 101653R Ramp Number

    每一位都大于等于前一位的数叫Ramp Number 给一个数,如果不是Ramp Number输出-1,如果是Ramp Number输出比它小的Ramp Number的个数 只和每一位上的数字有关 #i ...

  5. java类的封装 继承 多态

    1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...

  6. Flex Array内置排序方法的使用

    在Array类中,提供内置的排序方法.排序是在软件开发的过程中,经常遇到的问题.通过这些内置的方法,可以快速轻便的进行排序操作. Array类提供sort方法对Array实例进行排序.sort方法没有 ...

  7. jsf服务器端验证用户输入

    服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...

  8. <C++Primer>第四版 阅读笔记 第二部分 “容器和算法”

    泛型算法中,所谓"泛型(generic)"指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素. 第九章 顺序容器 顺序容器的元素排列次序与元 ...

  9. python 输出颜色的与样式的方法

    上次遇到这个问题就想写下来,其实当时我也不怎么会,老师说这个东西不需要理解,只需要死记硬背,写的多了就记住了,所以今天搜集了几篇文章,加上自己的理解,写下了这篇python 输出颜色的样式与方法的文章 ...

随机推荐

  1. Django:学习笔记(7)——模型进阶

    Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...

  2. logstash安装

    1.下载并安装公共签名密钥 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 2.创建镜像源文件:/etc/yum.rep ...

  3. es6的Set和Map数据结构

    Set 和 Map 数据结构 Set WeakSet Map WeakMap Set § ⇧ 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set ...

  4. Java GC 标记/清除算法

    1) 标记/清除算法是怎么来的? 我们在程序运行期间如果想进行垃圾回收,就必须让GC线程与程序当中的线程互相配合,才能在不影响程序运行的前提下,顺利的将垃圾进行回收. 为了达到这个目的,标记/清除算法 ...

  5. PHP秒杀系统全方位设计分析(二)

    商品页面开发 静态化展示页面[效率要比动态PHP高很多,PHP程序需要解析等步骤,本身就需要很多流程,整个下来PHP的处理花的时间和资源要多] 商品状态的控制 开始前.进行中.库存不足.结束 数据逻辑 ...

  6. 20145328 《Java程序设计》第0周学习总结

    20145328 <Java程序设计>第0周学习总结 阅读心得 从总体上来说,这几篇文章都是围绕着软件工程专业的一些现象来进行描述的,但深入了解之后就可以发现,无论是软件工程专业还是我们现 ...

  7. HDFS并行复制Distcp

    1)Distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具. 2)distcp命令是以MR作业(没有R任务)的形式实现的,把文件和目录的列表作为M任务的输入.每一个文件是由一个M任务来拷贝 ...

  8. js 代码执行时间

      <html> <head> </script> <script> var sTime=new Date().getTime(); alert(&qu ...

  9. MySQL MERGE存储引擎 简介及用法

    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...

  10. CSS样式遇见的问题总结记录

    一.子元素都是浮动元素时,父元素最好是不用设置高度,防止子元素不设置高度溢出父元素 有时候会有零点几的误差高度 直接设置子元素高度即可 通过 clear: both;清除子元素浮动达到父元素自适应高度 ...