首页 > 其他分享 >《剑指Offer》-20-表示数值的字符串

《剑指Offer》-20-表示数值的字符串

时间:2023-09-09 15:22:28浏览次数:28  
标签:begin 20 && Offer 空格 num str 字符串 pointer

这种按照一定规则来验证字符串的题看起来很麻烦,想到另外一道类似的是验证 IP 地址

……我觉得我理不清这个判断逻辑以及各个逻辑间的关系以控制逻辑

	bool isNumber(string s) {
		// 首先这个字符串可能得样式为
		// [若干可能的空格][[+/-][num./num.num/.num/num]][E/e][[+/-][num]][若干可能的空格]
		int begin = 0;
		while (s[begin] == ' ' && begin<s.size()) begin++;
		// 得到第一个不为空的位置,开始验证
		if (s[begin] == s.size()) return false;// 一个全是空格的字符串

		int ePlace = begin;
		while (s[ePlace] != 'E' && s[ePlace] != 'e' && ePlace < s.size()) {
			ePlace++;
		}

		if (s[begin] >= 48 && s[begin] <= 57) {
			// 字符是一个数字
		}
		else {
			if (s[begin] == '+' || s[begin] == '-') begin++;
			else 
		}
		return false;
	}

比如:如果我想要从头到尾一个一个可能性地判断就会非常的复杂繁琐,我需要考虑每一种可能,写很多的return falseif()

但是如果想要通过调用函数的方式,我有必须知道每一部分的起始和结束位置

	bool isNumber(string s) {
		// 首先这个字符串可能得样式为
		// [若干可能的空格][[+/-][num./num.num/.num/num]][E/e][[+/-][num]][若干可能的空格]
		int begin = 0;
		while (s[begin] == ' ' && begin<s.size()) begin++;
		// 得到第一个不为空的位置,开始验证
		if (s[begin] == s.size()) return false;// 一个全是空格的字符串

		int ePlace = begin;
		while (s[ePlace] != 'E' && s[ePlace] != 'e' && ePlace < s.size()) {
			ePlace++;
		}
		return false;
	}
	// 判断是不是一个合法的整数
	bool isInteger(string &str,int begin,int end){
		if (begin >= end && str[begin] == '+' || str[begin] == '-' || (str[begin] >= 48 && str[begin] <= 57)) {
			begin++;
			while (str[begin] >= 48 && str[begin] <= 57) {
				begin++;
				if (begin == end) return true;
			}
		}
		return false;
	}
	// 判断是不是一个合法的小数
	bool isDcimal(string &str,int begin,int end) {
		if (begin >= end) return false;
		if (str[begin] == '+' || str[begin] == '-') begin++;
		else if (str[begin] >= 48 && str[begin] <= 57) {
			// 是一个数字,后面可以是小数点也可以是数字
			begin++;
		}
		else if (str[begin == '.']) {
			// 小数点开头,后面必须有数字
			begin++;
			while (str[begin] >= 48 && str[begin] <= 57) {
				begin++;
				if (begin == end) return true;
			}
		}
		return false;
	}

不管是哪样,这么分类讨论太麻烦了,而且也很容易出错

书上官解

官解和力扣题目有差异,力扣要求更多,主要是会有空格,前后中间都有可能有空格

给官解打了补丁 AC

	bool isNumber(string s) {
		const char* pointer = s.c_str();// 获取字符指针

		while (*pointer == ' ') ++pointer;// 跳过前导空格

		bool numeric = scanInteger(&pointer);

		if (*pointer == '.') {
			++pointer;
			/*
			* 为什么会有||运算?
			* 小数点前面可有可无,后面可有可无,但是不能都无
			* [带符号数字].[不带符号数字]
			*/
			numeric = scanUnsignedInteger(&pointer) || numeric;
		}

		if (*pointer == 'E' || *pointer == 'e') {
			++pointer;
			// E前面和后面都必须有数字
			numeric = scanInteger(&pointer) && numeric;
		}
		// 如果指针停在了空格,需要检查空格后面还有没有字符
		if (numeric) {
			while (*pointer == ' ') ++pointer;
			return *pointer == '\0';
		}

		return false;
	}

	bool scanInteger(const char** str) {
		if (**str == '+' || **str == '-') ++(*str);
		return scanUnsignedInteger(str);
	}

	bool scanUnsignedInteger(const char** str) {
		const char* before = *str;
		while (**str != '\0' && **str!=' ' && **str >= '0' && **str <= '9') ++(*str);
		return *str > before;// 是有效长度的字符串,只要字符串存在从当前位置开始的一段数字就返回true
	}

后面有机会的话试着当做一个 正则表达式的练习题题做一遍

标签:begin,20,&&,Offer,空格,num,str,字符串,pointer
From: https://www.cnblogs.com/yaocy/p/17687091.html

相关文章

  • SMU Autumn 2023 Round 1(Div.1)
    SMUAutumn2023Round1(Div.1)A.SetorDecrease(枚举)题意就是你可以进行两种操作,将\(a_i-1\)或者令\(a_i\)等于\(a_j\),然后使得\(\sum\limits_{i=1}^{n}a_i\leqk\),求最少的操作步数首先我们让一个大数变成一个最小数的贡献肯定是要比让大数减一产生的贡献更多,所以我......
  • 31个必备的Python字符串方法总结
     字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。 1、Slicingslicing切片,按照一定条件从列表或者元组中取出部分元素(比如特定范围、索引、分割值)s='hello's=s[:]print(s)#hellos='hello's=s[3:8]print(s)#hello 2......
  • SY2023CTF--“安洵杯”全国精英赛MISC--烦人的压缩包
    前言:由于最近要比第二届技能大赛CTF就玩的少(我很菜,求大佬带)随便看看做了一题那个数独也简单不敢兴趣就run了烦人的压缩包:首先下载下来一个压缩包需要密码直接爆破一下使用工具:Ziperello得到密码:645321解压打开得到两个文件hint.txt和love.jpg放入010Editor发现是有......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第一周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第一周学习笔记一、任务要求任务详情自学教材第1,2章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)......
  • 2019 ICPC Universidad Nacional de Colombia Programming Contest
    A.Amazon给定\(n\)条直线(存在共线的情况),在每两条垂直的直线的交点处需要建一个交叉点,求交叉点的数量,注意需要去除共线时候的交叉点题解因为要除去共线的情况,我们考虑将一条直线以方向向量\(v\),与\(x\)轴的交点的横坐标\(x\)的方式存储注意:对于\(v\)来说需要最简形......
  • 2023-09-09 微信小程序之引入uni_modules过多插件导致主包体积过大如何解决 ==》hbuil
    前言:uni_modules里面的插件会全部打包在主包里,分包如果都是引用了uni_modules的插件,那么会导致包体积越来越大。我的项目主要用到一些组件库,如uview,对这个库的依赖太严重了,加上是把2个小程序融合到一起,所以对这个库的依赖就会变得更多。解决方案:你的小程序是用uniapp开发,才能使......
  • 洛谷P8211 [THUPC2022 初赛] 搬砖
    题目链接以下设\(B\)为一个阈值,同时也表示值域分块的块长。先考虑所有\(b\)都不为\(0\)的情况。对于一组询问,我们设一个\(x\)表示:当前已搬完所有\(a\leqx\)的砖。那么每次只可能是以下两种情况之一:有至少一摞砖在当前这个单位时间内被搬完拿\(x\)加上\(d\),之......
  • 将pandas某列中的字符串按空格或换行符拆分成列表,然后剔除列表中的中文字符串
    要删除PandasDataFrame中某一列中的汉字字符,然后将该列的字符串按空格或换行符拆分成列表,可以按照以下步骤进行:假设你有一个名为df的DataFrame,要操作的列名为'某列':importpandasaspd#创建示例DataFramedata={'某列':['Hello你好','Thisisatest','Python编......
  • 地球第三极亮相2023中国服贸会 西藏极净特产登上世界舞台
    来源:珠峰云APP9月2日,2023年中国国际服务贸易交易会(以下简称“服贸会”)在北京正式拉开帷幕。地球第三极以西藏自治区区域公共品牌形象亮相,为全球展商带去众多西藏极净特产,让世界看见西藏好品质。据悉,本届服贸会以“开放引领发展,合作共赢未来”为主题,于9月2日至6日在国家会议......
  • SQL Server2019服务端启停
    服务器端是数据库,客户端是访问数据库的驱动。 背景:有时候只需要连接远程数据库操作即可,本地服务端可以暂不开启,减少内存的开销。 启动:1、任务管理器-服务-SQLServer(MSSQLSERVER)启动 开始后: 2、计算机管理-服务-SQLServer(MSSQLSERVER)启动 3、打开【开始】......