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

news2025/1/21 3:02:59

表示数值的字符串

原题链接:
剑指 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.2
                return 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,如:ee32
                return 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')
    {
        //如果是末尾的空格返回true
        return true;
    }
    else
    {
        //如果是中间的空格返回false
        return false;
    }
}

 

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

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

相关文章

常见胶片的分类和结构

胶片的分类方法非常多&#xff0c;本质上属于高分子材料范畴&#xff0c;很多类别已经超出笔者的认知范围&#xff0c;我们只对与档案数字资源长期保存和异质备份相关的胶片分类方法进行介绍。笔者整理了十大分类如下图所示&#xff1a; 各分类简要介绍 1. 按宽度尺寸分类 常…

【Linux】进程信号万字详解(上)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

194: vue+openlayers 根据卫星lat,lon,alt,俯仰角,方位角,绘制地面的拍摄的区域

第194个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中研究卫星的拍摄范围。 根据卫星的高度,经度,纬度,方位角,俯仰角以及拍摄的幅宽,幅长等参数,绘制拍摄的矩形框和中心点。这里用到了一些公式,参考代码,尤其是大部分使用的是弧度而非角度,需…

青铜到王者,8本最好的Python从入门到进阶的书

春节长假还有1周了&#xff0c;是时候囤一些书充充电了&#xff01;新的一年群里很多小伙伴开始想学Python&#xff0c; 无论是准备转行的&#xff0c;还是想多学一份技能提高职场竞争力的&#xff0c;都想选择Python赛道&#xff0c;下面给大家推荐一些非常不错的Python入门到…

联合证券|利好叠加有望实质兑现 机构加码布局装修建材

组织加码布局装饰建材板块。据了解&#xff0c;受房地产利好方针带动、职业竞赛格式持续改进及原材料本钱下降等多重利好叠加&#xff0c;装饰建材板块有望迎来实质性利好&#xff0c;虽然曩昔两个多月来相关公司有所反弹&#xff0c;但组织以为行情仍然在路上。 多重利好推进 …

架构设计---高可用的处理

前言&#xff1a; 系统的高可用架构就是要在上述各种故障情况下&#xff0c;保证系统依然可用提供服务&#xff0c;具体包括以下几种架构方案。 冗余备份&#xff1a; 各种服务器故障是不可避免的&#xff0c;架构设计上就要保证&#xff0c;当服务器故障的时候&#xff0c;…

简短通俗理解动态规划算法--最短路径问题

问题&#xff1a;从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中&#xff0c;各边上权值之和最小的一条路径——最短路径。在博客动态规划算法中介绍了动态规划的基本思想已经建立动态规划模型的步骤&#xff0c;下面将其中的方法分析最短路径问题。 最短路径有…

CBAM: Convolutional Block Attention Module

https://arxiv.org/pdf/1807.06521.pdf 摘要&#xff1a; 我们提出了卷积块注意模块(CBAM)&#xff0c;一个简单而有效的用于前馈卷积神经网络的注意模块。给定中间特征图&#xff0c;我们的模块依次推导出沿通道和空间两个独立维度的注意图&#xff0c;然后将注意图乘到输入…

vue-seamless-scroll数据量少时,暂停滚动,继续滚动

需求内容 大屏项目&#xff1a;指定dom元素内&#xff0c;如果子元素内容过多&#xff0c;超出父元素的最高高度&#xff0c;可以发生自动滚动&#xff1b;如果子元素内容没有超出父元素的最高高度&#xff0c;不可以发生自动滚动。 . 实现方案 获取数据后并渲染到dom后&am…

并查集的查询与合并详解

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

SpringCloud学习笔记 - Nacos集群配置和配置持久化

1. 集群架构 要组成集群Nacos必须要有3个或以上的Nacos服务节点&#xff0c;官网推荐在生产服务中使用集群架构。 官网对Nacos集群架构的说明&#xff1a;https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 总体来说有三种方式可以实现Nacos集群部署&#xff1a; …

恒远模式(flyweight)

简介&#xff1a;共享对象&#xff0c;当一个对象可以被多次利用的时候&#xff0c;并且对象内部相同&#xff0c;这个时候需要考虑让对象进行复用&#xff0c;而不是多次创建结构图&#xff1a;代码就不写了&#xff0c;因为我觉得这东西没啥用&#xff0c;因为一个对象对应的…

技术分享 | 测试平台开发-前端开发之Vue.js 框架

Vue.js 是一套用于构建用户界面的渐进式框架&#xff0c;在目前的前端开放中比较流行的前端框架。Vue 被设计成自底向上的逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或已有项目整合。但是学习 Vue.js 需要一定的 HTML、CSS、和 …

指针进阶(3)

tips 1. sizeof的返回类型时size_t。size_t就是为sizeof量身定做的&#xff0c;size_t就是unsigned int 2. strlen碰到\0会停下来&#xff0c;而sizeof则不会&#xff0c;也将其算作一个字符 3. 要注意这么两对东西&#xff1a; scanf()与gets(): \0 , \n , 空格 …

<TCP网络编程>——《计算机网络》

目录 1.TCP网络程序 1.1 TCP socket API 1.1.1 socket(): 1.1.2 bind():​ 1.1.3 listen(): ​ 1.1.4 accept(): 1.1.5 connect(): 2. 封装 TCP socket 2.1 实现一个简单的英译汉的功能 3.简单的TCP网络程序(多进程版本) 4. 简单的TCP网络程序(多线程版本) 5. 线程…

SpringBoot自定义MessageConvert

目录 前言 原理 实现 拓展 前言 对于页面携带的请求头中的AcceptSpringBoot有对应的10种MessageConvert可以支持写出对应的媒体类型&#xff0c;比如application/xml、application/json…… 我们还可以通过向容器放入一个WebMvcConfigurer 实现定制化SpingMVC&#xff0…

Android 深入系统完全讲解(7)

7 如何调试代码&#xff0c;JNI&#xff0c;Framework,APP 调试技巧是我在每入职一家新公司&#xff0c;都会给大家分享的。在 MTK 官方培训还是需要编译才能调试的时候&#xff0c;我无意中调试 MMS 代码&#xff0c;发现跟进了系统代码&#xff0c;调试了相关的匹配搜索子串代…

Java多线程(一)——Hotspot的锁( Synchronized)

1. 锁的概念 Java语言为了解决并发编程中存在的原子性、可见性和有序性问题&#xff0c;提供了一系列和并发处理相关的关键字&#xff0c;比如synchronized、volatile、final、concurren包等 2. Synchronized的基本使用 synchronized是Java提供的一个并发控制的关键字。主要…

【LINUX】工具篇--gcc的使用

我们知道&#xff0c;在程序翻译的过程中一般会经过四个步骤预处理头文件展开&#xff0c;条件编译&#xff0c;宏替换&#xff0c;去注释编译C语言代码--->汇编代码汇编汇编代码--->可重定向目标二进制文件(只把自己写的函数形成二进制文件&#xff0c;此阶段无法被执行…

Vue3一学就会系列:02 模板语法与计算属性

系列文章目录 Vue3一学就会系列&#xff1a;01 vue3安装与搭建项目 文章目录系列文章目录文本插值html 插入属性绑定常用指令计算属性总结文本插值 最基本的数据绑定形式是文本插值&#xff0c;它使用的是“Mustache”语法 (即双大括号)&#xff1a; 知识点&#xff1a; {{}}…