小练习:vaild number

1.描述

  给定字符串,若该字符串表示的是数字,则输出true,否则输出false

2.分析

  题目一看感觉不难,做起来却很麻烦,首先是数字的各种表示要知道,然后就是对这些不同形式的数字进行筛选判断。该题目中合法数字的表示形式如下:

±12  // 前缀有正负号合法
1.2
1.
.1
1e2
1.e2
1e±2

//以上数字中间不含空格

  思路:

  总原则,出现非法字符(.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 = 0, dotFlag = 0, startFlag = 0, spaceFlag = 0, numFlag = 0, dotEFlag = 0, signFlag = 0, esignFlag = 0, signnumFlag = 0; //一些标志位
int i = 0, j = s.length() - 1; // 设立哨兵

for (;;) // 压缩头尾,提取有效字段
{
	if (sp[i]<48 || sp[i]>57)
	{
		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 = 1;
			i++;
		}
		else
			startFlag = 1;

	}
//-----------------------------------------------------+
	if (sp[j] == ‘e‘ || sp[j] == ‘+‘ || sp[j] == ‘-‘)  // <---尾
		return false;
	else
	{
		if (sp[j] == ‘ ‘)
			j--;
		else if (startFlag)
			break;
	}

}
//-----------------------------------------------------+
for (; i<j + 1; i++)  //对有效字段内进行检查
{
	if (sp[i]<48 || sp[i]>57)
	{
		if (sp[i] != ‘.‘&& sp[i] && sp[i] != ‘e‘&&sp[i] != ‘+‘&&sp[i] != ‘-‘) // 排除非法字符
			return false;
	}
	else
	{
		numFlag = 1;
	}
//-----------------------------------------------------+
	if (sp[i] == ‘e‘) // 为‘e‘的情况
	{
		eFlag++;

		esignFlag = i; //用来检查 "1e±1"类型
		if (i == 1 && dotEFlag) //用来排除".e1"类型
			return false;
		if (i == (j - 1))
			dotEFlag = 1;

		if (eFlag>1)
			return false;
	}
//-----------------------------------------------------+
	else if (sp[i] == ‘.‘) // 为 ‘.‘ 的情况 非法情况是 ".e1""..1"等
	{
		dotFlag++;
		if (i == 0)
			dotEFlag = 1;

		if (dotEFlag&&i == j) // 用来检查e在.前
			return false;

		if (eFlag)
			return false;

		if (dotFlag>1)
			return false;

	}
//-----------------------------------------------------+
	else if (sp[i] == ‘+‘ || sp[i] == ‘-‘) //为‘+‘‘-‘的情况
	{
		signnumFlag++;
		if (i>esignFlag + 1||!eFlag)
			return false;
		if (signnumFlag>1)
			return false;
	}

}
if (!numFlag)
	return false;
return true;
}

  经过测试,算法可以使用。

时间: 2024-11-10 01:13:44

小练习:vaild number的相关文章

数位DP || Gym 101653R Ramp Number

每一位都大于等于前一位的数叫Ramp Number 给一个数,如果不是Ramp Number输出-1,如果是Ramp Number输出比它小的Ramp Number的个数 只和每一位上的数字有关 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <queue> #include &l

猜一猜小游戏

#coding=gbk #coding=utf-8 #-*- coding: UTF-8 -*- from encodings import utf_8 import random print('--------猜一猜游戏------------') num1 = int(input("请输入开始的区间数:")) num2 = int(input("请输入结束的区间数:")) number = random.randint(num1,num2) while True

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

230. 二叉搜索树中第K小的元素 题意 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 解题思路 中序遍历,利用Python3中提供的生成器方法: 中序遍历,判断存储结点值的数组是否到到k,则表明访问的一个结点就是第k个最小的元素: 先获取跟结点处于的位置(第几个最小的元素),如果它比k小,则从右子结点中找,如果它比k大,则从左子节点中找: 实现 class Solution:    

MySQL复习

一.删除 我用的是zip版,只要解压了就可以了.不过对于解压版,mysql真是超级难删除干净.第一次安装难免要出错重新安装的,但是系统又提示你已经安装了,卸载不干净真的烦,所以先说怎么删除干净. 1:到控制面板里面先把mysql删除. 2:到自己的安装目录下把mysql目录删除. 3.如果在其他盘还有设置目录也要删除.空目录也要删除 4.到regedit把注册表 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applicati

C语言之选择结构与循环结构

1.if的基本认识 /* if判断语句的格式 if(条件表达式1) { 语句1... } else if (条件表达式2) { 语句2... } else { 语句3... } 若果条件表达式1成立,只执行语句1. 不成立就往下判断 如果条件表达式2成立,只执行语句2, 如果上述条件都不成立,就执行语句3 //if可以嵌套使用 if (条件表达式1) { if(条件表达式) { } } else { } */ 来个小练习练练手吧 int a = 10; if (a >= 2) { if (a <

性能测试概念点分析与过程讲解(三)

6.1 参数化详解: 首先,我还是要巴拉巴拉一下参数化的概念和意义,什么叫做参数化:参数化,就是在我们录制好脚本,或者写好提交请求中那些被写死的值,但是这些值又会因为提交请求不同或者用户要求变化而做的一个工作,其本质就是每次提交中力求能让这个参数的值得到变动更新.那么为什么要参数化:简单的说,就是为了更符合需求,让模拟的提交数据更符合真实数据.比如测试登入功能,如果不做参数化,那么所有的提交请求都是同一个用户在做登入操作,虽然不见得每个系统都对用户登入做了限制值允许同一个用户同一时间登入一次,在

Javascript 基础

一. 简介 1. 什么是javascript JavaScript 是网景(Netscape)公司开发的一种基于客户端浏览器.面向(基于)对象.事件驱动式的网页脚本语言. 2. 为什么要使用javascript 表单验证 网页特效 小游戏 Ajax 3.快速入门 在程序中,如果想编写js代码,有两种办法: 1)在html文件中,在一对script标记中,直接编写 <script language='javascript'> document.write('hello'); </scrip

Java多线程共享变量控制

1. 可见性 如果一个线程对共享变量值的修改,能够及时的被其他线程看到,叫做共享变量的可见性.如果一个变量同时在多个线程的工作内存中存在副本,那么这个变量就叫共享变量 2. JMM(java内存模型) 多个线程同时对主内存的一个共享变量进行读取和修改时,首先会读取这个变量到自己的工作线程成为一个副本中,改动之后,再更新回主线程中变量内存. 两条规定: a.线程对共享变量的所有操作必须在工作内存中进行,不能直接操作主内存 b.不同线程间不能访问彼此的工作内存中的变量,线程间变量值的传递都必须经过主

jsf服务器端验证用户输入

服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 ? 1 2 3 4 <h:inputText size="10" value="#{commodityBean.foradd.name}"                         id="input1">                         <f:validator validatorId="input1Validator"