小练习: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 输出颜色的样式与方法的文章 ...
随机推荐
- Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) C Andryusha and Colored Balloons
地址:http://codeforces.com/contest/782/problem/C 题目: C. Andryusha and Colored Balloons time limit per ...
- Python之路——堡垒机原理及其简单实现
1 堡垒机基本概述 其从功能上讲,它综合了核心系统运维和安全审计管控两大主干功能,从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的 ...
- UI自动化测试框架之Selenium关键字驱动 (转)
摘要 自动化测试框架demo,用关键字的形式将测试逻辑封装在数据文件中,测试工具解释这些关键字即可对其应用自动化 一.原理及特点 1. 关键字驱动测试是数据驱动测试的一种改进类型 2. 主要 ...
- 整理一些《纸书科学计算器》的小Tips
本文最开始是在2016年的文章 Win10应用<纸书科学计算器>更新啦! 发表之后撰写的,当时那篇文章收到了不少人点赞,应用在国内市场的日下载量也突然上涨,让我感到受宠若惊,这里要感谢Wp ...
- selenium+python—实现自动化测试基本思路
测试是一个贯穿于整个开发过程的连续过程,测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败. 为了让单元测试代码能够被测试和维护人员更容易地理解,最好的解决办法是 ...
- union遇上ntext数据类型
http://www.myhack58.com/Article/html/3/7/2011/31392.htm
- Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法
Android-服务中监听电源键和Home键的广播 http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...
- JAVA学习笔记之JAVA 对象引用以及赋值
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没 ...
- linux堆栈
linux堆栈 进 程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态 ...
- asp.net发送短信
public class SmsServiceManager { public static string Send(string PhoneNumber, out string sendNo) { ...