剑指offer----C语言版----第十四天

news/2024/11/27 23:47:27/

表示数值的字符串

原题链接:
剑指 Offer 20. 表示数值的字符串 - 力扣(LeetCode)

1.1 题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
        1.若干空格
        2.一个 小数 或者 整数
        3.(可选)一个 'e' 或 'E' ,后面跟着一个 整数
        4.若干空格
小数(按顺序)可以分成以下几个部分:
        1.(可选)一个符号字符('+' 或 '-')
        2.下述格式之一:
                  1.至少一位数字,后面跟着一个点 '.'
                  2.至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
                  3.一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
        1.(可选)一个符号字符('+' 或 '-')
        2.至少一位数字
部分数值列举如下:
       · ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
       · ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

1.2 思路分析

表示数值的字符串遵循模式 A[.[B]][e|EC]或者.B[e]EC],其中A 为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着'e或者E为数值的指数部分.在小数里可能没有数值的整数部分.例如,小数.123 等于0.123。因此 A 部分不是必需的。如果一个数没有整数部分,那么它的小数部分不

能为空。

上述A和 C都是可能以'+或者'-'开头的0~9 的数位串;B也是0~9的数位串,但前面不能有正负号。

以表示数值的字符串"123.45e+6"为例,“123”是它的整数部分A,“45”

是它的小数部分 B,“+6”是它的指数部分C。

判断一个字符串是否符合上述模式时,首先尽可能多地扫描0~9 的数位(有可能在起始处有'+'或者'-'),也就是前面模式中表示数值整数的A部分。如果遇到小数点.',则开始扫描表示数值小数部分的 B 部分。如果遇到'e'或者'E',则开始扫描表示数值指数的C 部分。

代码中有注释,说到底就是暴力枚举的感觉,剑指offer上跟leetcode上的题目略微有一点不同:剑指offer上表示数值的字符串前后没有空格。

bool isNumber(char* s){if(s == NULL){return false;}while(*s==' ') //跳过前面的空格{s++;}if(*s=='+'||*s=='-') //判断正负号{s++;if(*s=='+'||*s=='-') //连续的两个正负号{return false;}}if(*s=='\0') //只有正负号的情况{return false;}int dot = 0, e = 0, num = 0; //记录小数点,e,数字出现的次数//遍历随后的字符串while(*s!='\0'){if(*s>='0'&&*s<='9'){s++;num++;}else if(*s=='.'){if(dot > 0||e>0){//在出现小数点时如果已经有小数点了,如: ..34 ; 或者e后面出现小数点,如:e3.2return false;}s++;dot++;if(num==0 && !(*s>='0'&&*s<='9')) {return false;}}else if(*s=='e'||*s=='E') //判断e{if(num == 0 || e > 0){//出现e却没有数字,如:e23;或者出现多个e,如:ee32return false;}s++;e++;if(*s=='+'||*s=='-') //判断正负号{s++;if(*s=='+'||*s=='-') //连续的两个正负号, e后面不能连续的两个正负号{return false;}}if(*s=='\0'||*s==' ') //如果e后面就没了,return false{return false;}        }else if(*s == ' '){break; //遇到空格直接跳出循环}else{return false;}}while(*s==' ') {s++;}if(*s=='\0'){//如果是末尾的空格返回truereturn true;}else{//如果是中间的空格返回falsereturn false;}
}

 


http://www.ppmy.cn/news/10874.html

相关文章

GDI对象泄漏导致程序UI界面绘制异常的问题排查

目录 1、问题说明 2、初步分析 3、查看任务管理器&#xff0c;并使用GDIView工具分析 4、GDIView可能对Win10兼容性不好&#xff0c;显示的GDI对象个数不太准确 5、采用历史版本比对法&#xff0c;确定初次出现问题的时间点&#xff0c;并查看前一天的代码修改记录 6、将…

特定领域知识图谱知识融合方案(实体对齐)

优酷领域知识图谱为例{基础方案}1.1领域知识图谱模式层构建(业务侧已完成) 在领域知识图谱中,模式层(Schema Level)的构建一般会先于数据层,知识图谱的schema在构建过程中,不仅借助行业专业人员并对大量的底层数据做分析和提炼来明确领域的基本属性、明确属性的适用概念、…

LeetCode053_53. 最大子数组和

LeetCode053_53. 最大子数组和 一、描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums …

Python开发Web扫描器实战

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Python开发Web扫描器实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

并查集的查询与合并详解

文章目录 一、并查集的概念 二、并查集的实现 2、1 并查集不同集合&#xff08;树&#xff09;的形成 2、2 find&#xff08;&#xff09;函数找一个元素集合的编号&#xff08;元素所属于树的祖宗&#xff09; 2、3 合并两个不同集合&#xff08;合并两棵不同的树&#xff09…

Vue3兄弟,爷孙组件间传值【包含手撸发布/订阅类】

Vue2【Vue基础十】— 兄弟组件之间传值【中央事件总线&#xff0c;消息订阅与发布】 Vue2 : 【Vue基础九】–父子组件传值 一、 兄弟组件 1-1 事件总线 使用Vue3&#xff0c;会发现&#xff0c;原本得心应手的eventBus突然不灵了Vue3不再提供$on与emit函数&#xff0c;Vue实例…

Pytorch - 使用pytorch自带的Resnet作为网络的backbone

在使用Pytorch搭建自己的神经网络框架时&#xff0c;经常需要使用Pytorch中内置的torchvision.models中的模型作为特征提取的Backbone&#xff0c;然后再在这个基础上进行更加复杂的网络搭建。 在这里以使用Pytorch中内置的Resnet18为例&#xff0c;如何作为Backbone层进行使用…

环形缓冲区

文章目录一. 什么是环形缓冲区&#xff1f;二、实现环形缓冲区&#xff1a;三、环形缓冲区示例代码&#xff1a;总结一. 什么是环形缓冲区&#xff1f; 环形缓冲区 是一段 先进先出 的循环缓冲区&#xff0c;有一定的大小&#xff0c;我们可以把它抽象理解为一块环形的内存。 …