剑指offer(C++)-JZ20:表示数值的字符串(算法-模拟)

news2024/11/25 17:23:40

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

请实现一个函数用来判断字符串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)遍历法

       integer函数用于判断是否存在有符号数,可能是+11、-8、11、8,若为+11a,也为true,下标符号停留在非数字字符的第一个位置。

       unsigned_integer函数用于判断是否存在无符号数,可能是11、8,若为11a,也为true,下标符号停留在非数字字符的前一个位置。

       遍历开始,将所有空格去除;首先执行一次integer函数,判断是否存在某个有符号数,此时下标符号idx指向该数字后的一个字符;继续判断idx是否为小数点,若为小数点,则执行一次unsigned_integer函数,判断小数点后是否有无符号数,小数点前后只要存在数字,则flag为true;向后继续判断idx是否为e或者E,即科学计数法,若是则执行一次integer函数,科学计数法允许后面数字带符号,这里前后需要都有数字才能为true,用与运算;最后如果遍历未完,说明还有别的字符,返回false。

       复杂度O(n)。

2)正则表达式

       正则表达式为(\\s)*[+-]?((\\d+(\\.(\\d+)?)?)|(\\.\\d+))([Ee][+-]?\\d+)?(\\s)*。

       C++需要用\\表示\,\\s为空格,\\d+为任意整数,\\.为小数点,*表示前面的内容匹配0或多个,?表示前面的内容可有可无,|表示前后内容满足一个即可。

       拆分说明:

  1. (\\s)*表示匹配空格,字符串前后各有一个,是因为题目上前后可能有不等的空格。
  2. [+-]?表示符号可有可无。
  3. ((\\d+(\\.(\\d+)?)?),\\.(\\d+)?表示小数点后数字可有可无;再框一层(\\.(\\d+)?)?,表示小数点及其后面数字均可有可无;再框一层((\\d+(\\.(\\d+)?)?),表示数字要有,至于后续的小数点及其数字均是可有可无。
  4. (\\.\\d+))表示小数点前无数字,那小数点后要有数字才行。
  5. ([Ee][+-]?\\d+)?同理,E或e的后面正负号可有可无,但数字要有;?表示这个整体是可有可无的。

测试代码:

1)遍历法

class Solution {
public:
    int idx = 0;
    // 是否为有符号数
    bool integer(string &s){
        if(idx < s.length() && (s[idx] == '-' || s[idx] == '+')){
            idx++;
        }
        return unsigned_integer(s);
    }
    // 是否为无符号数
    bool unsigned_integer(string &s){
        int temp = idx;
        while(idx < s.length() && (s[idx] >= '0' && s[idx] <= '9')){
            idx++;
        }
        return idx > temp;
    }
    // 是否为数值
    bool isNumeric(string str) {
        // 去除空格
        int size = int(str.size());
        string nospace = "";
        for(int i = 0; i < size; ++i){
            if(str[i] != ' '){
                nospace += str[i];
            }
        }
        // 判空
        size = int(nospace.size());
        if(str.length() == 0){
            return false;
        }
        // 判断小数点或e前的字符串
        bool flag = integer(nospace);
        // 判断是否存在小数点
        if(idx < size && nospace[idx] == '.'){
            idx++;
            // 判断前后是否存在数字,若都不存在,则false
            flag = unsigned_integer(nospace) || flag;
        }
        // 判断是否存在e
        if(idx < size && (nospace[idx] == 'e' || nospace[idx] == 'E')){
            idx++;
            // 判断后面是否为数字
            flag = flag && integer(nospace);
        }
        // 判断是否遍历完毕
        return flag && (idx == size);
    }
};

2)正则表达式

#include<regex>
class Solution {
public:
    // 是否为数值
    bool isNumeric(string str) {
        // 正则表达式匹配
        string pattern = "(\\s)*[+-]?((\\d+(\\.(\\d+)?)?)|(\\.\\d+))([Ee][+-]?\\d+)?(\\s)*";
        regex re(pattern);
        // 根据匹配值返回
        return regex_match(str, re);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1022455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何成为一个牛逼的脚本小子日记之0x001-JAVA 代码审计 Top half (2023829-...

如何成为一个牛逼的脚本小子日记之 0x001-JAVA 代码审计 Top half (2023/8/29-2023/9/1) 此记录是在拥有一定的java基础下进行的,java基础类,反射,继承,filter,servlet,calssLoader,Dynamic agent等基础知识点将不再进行阐述,TopHalf主要集中描述除了java反序列化之外的基础漏…

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大&#xff0c;大多数教程都是使用 keil 编译器&#xff0c;keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc vscode 开发单片机程序的经验。&#xff08;这里不解释 gcc 是什么&#xff09;。 ​第一&#xff1a;环境准备 gcc ARM 开发者官网 h…

创新视界论坛项目测试报告

目录 一、项目背景 1.1 项目简介 1.2 核心功能 1.3 项目要点 二、测试计划 2.1 测试环境 2.2 测试用例编写 2.2.1 功能测试 2.2.2 非功能测试 2.3 功能测试操作步骤 2.3.1 对注册页面进行测试 2.3.2 对登录页面进行测试 2.3.3 对首页页面进行测试 2.3.4 对帖子发…

SpringBoot调用ChatGPT-API实现智能对话

目录 一、说明 二、代码 2.1、对话测试 2.2、单次对话 2.3、连续对话 2.4、AI绘画 一、说明 我们在登录chatgpt官网进行对话是不收费的&#xff0c;但需要魔法。在调用官网的API时&#xff0c;在代码层面上使用&#xff0c;通过API KEY进行对话是收费的&#xff0c;不过刚…

企业架构LNMP学习笔记52

Redis安全限制&#xff1a; IP限制登录&#xff1a; 打开配置IP限制&#xff1a; 注意&#xff0c;如果有防火墙&#xff0c;先关闭防火墙&#xff0c;或者开启端口限制。 重启服务&#xff0c;检测是否启动成功。 远程连接测试&#xff1a; 密码验证&#xff1a; 修改配置…

成集云 | 金蝶云星辰集成聚水潭ERP(金蝶云星辰主管库存)| 解决方案

源系统成集云目标系统 方案介绍 金蝶云星辰是金蝶旗下的一款企业级SaaS管理云&#xff0c;其目标是帮助企业拓客开源、智能管理和实时决策。为了实现这一目标&#xff0c;它为企业提供了多种SaaS服务&#xff0c;包括财务云、税务云、进销存云、生产云、零售云、电商…

java调用天地图api获取地理信息

目录 1、注册账号登录 2、创建应用&#xff0c;获取key 3、查看接口示例 4、调用接口 4.1地理编码查询 4.2逆地理编码查询 天地图网址&#xff1a;天地图API 1、注册账号登录 2、创建应用&#xff0c;获取key 3、查看接口示例 4、调用接口 4.1地理编码查询 public cla…

Cesium 测量距离

Cesium 测量距离 需求分析第一种方式&#xff1a;使用测距 Measure第二中方式&#xff1a;使用 distance&#xff0c;自己封装第三种方式&#xff1a;自己封装&#xff08;样式不太好&#xff09; 需求 实际开发中我们经常需要用到量测工具&#xff0c;而Cesium没有直接提供量…

【AD操作】【原理图标注配置器】批量更新原理图的元件标签

原理图标注配置器 快捷键 T-A-A 1.调整编号顺序 2.设置起始编号 3.更新 和 执行变更 对 学习笔记&#xff0c;供自己复习参考。

Java基于微信小程序的自习室系统的设计,附源码、教程

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

摘要 将PDO封装成PHP类进行调用有很多好处&#xff0c;包括&#xff1a; 1、封装性和抽象性&#xff1a; 通过将PDO封装到一个类中&#xff0c;您可以将数据库操作逻辑与应用程序的其他部分分离开来&#xff0c;提高了代码的组织性和可维护性。这样&#xff0c;您只需在一个地…

面对IT部门和业务部门跨网文件交换的不同需求,怎样才能兼顾呢?

文件交换是企业中必不可少的一环&#xff0c;无论是内部员工之间&#xff0c;还是与外部客户、供应商、合作伙伴之间&#xff0c;都需要频繁地进行文件的发送和接收。然而&#xff0c;由于企业内外网之间的隔离&#xff0c;跨网文件交换往往面临着诸多困难和挑战。如何在保证文…

【Verilog语法】比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。

比较不同计数器的运算方式&#xff0c;其中有一个数是延迟打一拍的效果&#xff0c;目的是使得两个计数器的结果相同。 1&#xff0c;第一种2&#xff0c;第二种3&#xff0c;第三种 第三种方案&#xff0c;完成实现。 1&#xff0c;第一种 &#xff08;1&#xff09;RTL modu…

基于Python开发的火车票分析助手(源码+可执行程序+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的火车票分析助手&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;…

企业如何使员工保持工作的积极性?

保持员工的工作积极性对于企业来说至关重要。激发员工的热情和投入度可以提高工作效率、创造力和团队合作&#xff0c;进而为企业带来更好的成果和竞争优势。以下是一些企业可以采取的方法来确保员工保持积极性&#xff1a; 提供发展机会 员工希望在职业生涯中不断成长和发展…

数据库管理-第105期 安装Database Valut组件(20230919)

数据库管理-第105期 安装Database Valut组件&#xff08;20230919&#xff09; 之前无论是是EXPDP还是PDB中遇到的一些问题&#xff0c;其实都跟数据库的DV&#xff08;Database Valut&#xff09;组件有关&#xff0c;因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …

Seata 源码篇之AT模式启动流程 - 上 - 02

Seata 源码篇之AT模式启动流程 - 02 自动配置两个关键点 初始化初始化TM初始化RM初始化TC 全局事务执行流程TM 发起全局事务GlobalTransactional 注解处理全局事务的开启 TM 和 RM 执行分支事务IntroductionDelegatingIntroductionInterceptorDelegatePerTargetObjectIntroduct…

Linux开发工具之编辑器-vim

vim简单来说就是一款文本编辑器&#xff0c;用于写代码&#xff0c;更是一款多模式编辑器 vim的基本概念 vim有许多种模式&#xff0c;但是铁三角是以下三种模式&#xff1a;命令模式&#xff0c;插入模式&#xff0c;底行模式 1 正常/普通/命令模式&#xff08;默认打开&…

搭建私人图床结合内网穿透实现公网访问,让您的摄影作品连接世界

文章目录 1. 树洞外链网站搭建1.1 下载安装树洞外链1.2 树洞外链网页测试1.3 cpolar的安装和注册 2.本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试 社交平台具有庞…

Go 语言学习总结(9)—— Go 与 Java 全面对比总结

基本语法格式 Golang: 编码风格相对统一&#xff0c;简单&#xff0c;没有太多的语法糖等&#xff0c;Java层次清晰&#xff0c;全面面向对象。 变量相关 变量的声明及使用 在Java或者PHP、Python中&#xff0c;声明了变量&#xff0c;可以不使用&#xff0c;也不报错。 p…