当前位置: 首页 > news >正文

【剑指offer-C++】JZ20:表示数值的字符串

【剑指offer-C++】JZ20:表示数值的字符串

    • 题目描述
    • 解题思路

题目描述

描述:请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。

科学计数法的数字(按顺序)可以分成以下几个部分:
1.若干空格;
2.一个整数或者小数;
3.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个整数(可正可负);
4.若干空格;

小数(按顺序)可以分成以下几个部分:
1.若干空格;
2.(可选)一个符号字符(‘+’ 或 ‘-’);
3. 可能是以下描述格式之一:
3.1 至少一位数字,后面跟着一个点 ‘.’;
3.2 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字;
3.3 一个点 ‘.’ ,后面跟着至少一位数字;
4.若干空格;

整数(按顺序)可以分成以下几个部分:
1.若干空格;
2.(可选)一个符号字符(‘+’ 或 ‘-’);
3. 至少一位数字;
4.若干空格;

例如,字符串[“+100”,“5e2”,“-123”,“3.1416”,“-1E-16”]都表示数值。
但是[“12e”,“1a3.14”,“1.2.3”,“±5”,“12e+4.3”]都不是数值。

提示:
1.1 <= str.length <= 25;
2.str 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ ;
3.如果怀疑用例是不是能表示为数值的,可以使用python的print(float(str))去查看;

进阶:时间复杂度O(n) ,空间复杂度O(n) 。

输入:"123.45e+6"
返回值:true
输入:"1.2.3"
返回值:false
输入:"."
返回值:false
输入:"    .2  "
返回值:true

解题思路

表示数值的字符串:最直观的想法是,判断是否可以将字符串str转换为浮点数float,此处可以调用python中的内置函数float,如果发现异常则返回false,否则返回true。注意,虽然C++中的stof函数也能够把字符串转换成浮点数,但是其是读取到不满足即停止,比如字符串"1.2.3",stof会将其转换为1.2,但实际上整体是不能转换的。注意,python代码注意缩进。

def isNumeric(self , str: str) -> bool:try:float(str)except:return Falsereturn True

正则匹配:其实,该题描述,数字、空格、字母、正负号等,非常适合正则匹配,但是使用正则匹配需要对正则比较熟练。

^:匹配行开头;
$:匹配行结尾;
. :除换行的任意字符;
[]:匹配[]中的任意一个字符;
():设定分组,有几个()就有几个相应的匹配字符串;
\d:数字;
\D:\d取反;
\w:字母数字下划线;
\W:\w取反;
\s:空格;
\S:\s取反;
*:前面元素重复0次或者多次;
+:前面元素重复1次或者多次;
?:前面元素重复0次或者1次;
\:\;
|:逻辑或;
{n}:前面元素重复n次;
{n,}:前面元素重复至少n次;
{n,m}:前面元素重复至少n次,至多m次;

#include<regex> //导入库
regex pattern("……");  //模式串
smatch result; //匹配结果
bool ret=regex_match(str,result,pattern); //正则匹配
bool isNumeric(string str) 
{//\\s*表示若干空格//[+-]?表示正负号可选//(\\d+|\\d+\\.\\d*|\\.\\d+)表示整数或小数部分//([eE][+-]?\\d+)表示整数部分//\\s*表示若干空格regex pattern("\\s*[+-]?(\\d+|\\d+\\.\\d*|\\.\\d+)([eE][+-]?\\d+)?\\s*");return regex_match(str,pattern);
}

常规判断:符合大多数人直觉的解法还是枚举法,枚举各种情况,遍历每一个字符,然后根据各种可能的情况进行标记。使用布尔变量isNum标记之前是否出现过数字,使用布尔变量isDot标记之前是否出现过小数点,使用布尔变量isE标记之前是否出现过e或者E,三个变量均初始化为False。如果当前字符为数字则标记遇到数字;如果当前字符为小数点则需要判断小数点之前不能出现小数点或者e或者E;如果当前字符为e或者E则需要判断其前面必须要出现过数字并且不能出现e或者E同时后面可以出现数字;如果当前字符为正负号则其必须是第一个非空白位置或者是e或者E后面的第一个位置。如果上述满足,那么根据isNum是真还是假来返回。

remove(beg,end,value);  //移除区间(beg,end)中每一个“与value相等”的元素;
str.erase(remove(str.begin(),str.end(),' '),str.end()); //删除字符串str两边的空格;
bool isNumeric(string str) 
{bool isNum=false,isDot=false,isE=false;//删除字符串str两边的空格str.erase(remove(str.begin(),str.end(),' '),str.end());//cout<<str<<endl;//cout<<str.size()<<endl;for(int i=0;i<str.size();i++){if(str[i]>='0'&&str[i]<='9') //标记数字isNum=true;else if(str[i]=='.') //遇到小数点{if(isDot||isE) //判断合法性return false;isDot=true; //标记小数点}else if(str[i]=='e'||str[i]=='E') //遇到e/E{if(!isNum||isE) //判断合法性return false;isE=true; //标记e/EisNum=false; //后面可以出现数字}else if(str[i]=='+'||str[i]=='-'){if(i!=0&&str[i-1]!='e'&&str[i-1]!='E')return false;}else //不合法字符{  return false;}}return isNum;
}

相关文章:

【剑指offer-C++】JZ20:表示数值的字符串

【剑指offer-C】JZ20&#xff1a;表示数值的字符串题目描述解题思路题目描述 描述&#xff1a;请实现一个函数用来判断字符串str是否表示数值&#xff08;包括科学计数法的数字&#xff0c;小数和整数&#xff09;。 科学计数法的数字(按顺序&#xff09;可以分成以下几个部分…...

【NLP相关】深度学习领域不同编程IDE对比

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

定制ubuntu的docker镜像

ssh登录jdkmavenvimpingcurlFROM ubuntu:22.04RUN apt-get updateRUN apt-get install -y \vim \inetutils-ping \openssh-server \curl \openjdk-8-jdk \mavenRUN mkdir /var/run/sshdRUN echo root:root |chpasswdRUN sed -ri s/^#?PermitRootLogin\s.*/PermitRootLogin yes…...

我的 System Verilog 学习记录(8)

引言 本文简单介绍 SystemVerilog 的接口。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff09; 我的 System Verilog 学习记…...

详解JAVA字节码

目录 1.概述 2.字节码文件构成 2.1.魔数 2.2.版本号 2.3.常量池 2.4.访问标志 2.5.索引 2.6.字段表 2.7.方法表 3.字节码指令 3.1.概述 3.2.指令分类 3.2.1.加载存储指令 3.2.2.运算指令 3.2.3.其他指令 3.3.完整指令工作流程 4.字节码保护 1.概述 以往的编程…...

前端利用emailjs发送邮件

最近有一个需求&#xff0c;前端发送一个form表单到一个邮箱&#xff0c;找了一圈发现emailjs还不错就使用他了。首先emailjs官网注册一个账号注册完之后创建一个邮件服务&#xff08;我这里使用的是谷歌邮箱&#xff09;链接谷歌邮箱账户 然后创建服务接下来就要创建一个邮件的…...

16 Nacos服务端服务注册源码分析

Nacos服务端服务注册源码分析 服务端调用接口 我们已经知道客户端在注册服务的时候实际上是调用的NamingService.registerInstance这个方法来完成实例的注册&#xff0c;而且在最后我们也告诉了大家实际上从本质上讲服务注册就是调用的对应接口nacos/v1/ns/instance&#xff…...

Spring Boot2中如何优雅地个性化定制Jackson

概述 本文的编写初衷&#xff0c;是想了解一下Spring Boot2中&#xff0c;具体是怎么序列化和反序列化JSR 310日期时间体系的&#xff0c;Spring MVC应用场景有如下两个&#xff1a; 使用RequestBody来获取JSON参数并封装成实体对象&#xff1b;使用ResponseBody来把返回给前…...

2023年全国最新食品安全管理员精选真题及答案11

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 101.婴幼儿配方乳粉的产品配方应当经&#xff08;&#xff09;部门注册。…...

【脚本】用于得到某个文件/文件夹所有文件的存储大小(MB单位)

知识点 来自在线转换换算网页&#xff1a;在线文件大小(bit,bytes,KB,MB,GB,TB)转换换算 电脑中存储常用的单位&#xff1a; 1Byte(Byte 字节) 8Bit 1KB (Kilobyte 千字节) 1024Byte 1MB (Megabyte&#xff0c;兆字节&#xff0c;简称“兆”) 1024KB 1GB (Gigabyte&am…...

19- CNN进行Fashion-MNIST分类 (tensorflow系列) (项目十九)

项目要点 Fashion-MNIST总共有十个类别的图像。代码运行位置 CPU: cputf.config.set_visible_devices(tf.config.list_physical_devices("CPU"))fashion_mnist keras.datasets.fashion_mnist # fashion_mnist 数据导入训练数据和测试数据拆分: x_valid, x_train…...

【正点原子FPGA连载】第二十二章IP封装与接口定义实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十二章IP封装…...

【ElasticSearch8.X】学习笔记(二)

【ElasticSearch8.X】学习笔记四、基础操作4.1、索引操作4.1.1、创建索引4.1.2、查询指定索引4.1.3、查询所有索引4.1.4、 删除索引4.2、文档操作4.2.1、创建文档4.2.2、查询文档4.2.3、修改文档4.2.4、删除文档4.2.5、查询所有文档4.3、数据搜索4.3.1、匹配查询文档4.3.2、匹配…...

Ubuntu22.04安装、配置、美化、软件安装、配置开发环境

Ubuntu22.04安装、配置、美化、软件安装、配置开发环境 一、Ubuntu、Windows11&#xff08;10&#xff09;双系统安装 因为ubuntu的安装网上的教程特别多了&#xff0c;所以这里不做赘述&#xff0c;推荐使用小破站这个up主的教程&#xff1a;Windows 和 Ubuntu 双系统从安装到…...

企业电子招投标采购系统之系统的首页设计

​​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…...

Python爬虫-阿里翻译_csrf

前言 本文是该专栏的第37篇,后面会持续分享python爬虫干货知识,记得关注。 笔者在前面有介绍过百度翻译的案例,感兴趣的同学,可往前翻阅查看(JS逆向-百度翻译sign)。而本文,笔者要介绍的是阿里翻译,相对于百度翻译的参数被逆向需要花点时间,阿里相对于易上手。 下面…...

C语言实现三子棋【详解+全部源码】

大家好&#xff0c;我是你们熟悉的恒川 今天我们用C语言来实现三子棋 实现的过程很难&#xff0c;但我们一定要不放弃 三子棋1. 配置运行环境2. 三子棋游戏的初步实现2.1 建立三子棋分布模块2.2 创建一个名为board的二维数组并进行初始化2.3 搭建棋盘3. 接下来该讨论的事情3.1 …...

双指针法将时间复杂度从 O(n^2) 优化到 O(n)

[1] 什么是双指针法 双指针法&#xff08;Two Pointers&#xff09;是一种常见的算法技巧&#xff0c;常用于数组和链表等数据结构中。 双指针法的基本思想是维护两个指针&#xff0c;分别指向不同的位置&#xff0c;通过它们的移动来解决问题。在某些情况下&#xff0c;使用双…...

【SpringBoot系列】 Spring中自定义Session管理,Spring Session源码解析

系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 目录 系列文章:Spring Boot学习大纲,可以留言自己想了解的技术...

【上位机入门常见问题】SQLServer2019 安装指导

SQLServer2019 安装指导 这里要说一下SQLServer的版本问题&#xff0c;首先说纵向的高低版本&#xff0c;如果大家跟我学习&#xff0c;我教给大家的是T-SQL编程的方法&#xff0c;而不是直接操作菜单的方法&#xff0c;所以&#xff0c;我们学习中只要使用SQLServer2012或以上…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...