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

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

表示数值的字符串

原题链接:
剑指 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;
    }
}

 

相关文章:

  • C库函数:stdio.h
  • vim光速开发,你值得拥有
  • Linux中的vim最小集、指令集及其配置
  • webpack基本使用
  • 第二章:感知机
  • (考研湖科大教书匠计算机网络)第一章概述-第一节:因特网概述
  • 斯皮尔曼相关(spearman)相关性分析一文详解+python实例代码
  • 场景编程集锦-月光族的期待
  • Linux测试主机之间连通性和端口是否开放的方法
  • 【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击
  • webpack笔记
  • 机器学习(4)——周志华
  • 【卷积码系列4】卷积码的状态转移函数、距离谱和译码性能界分析及matlab仿真
  • 大数据NiFi(十一):NiFi入门案例一
  • Git:关于分支的操作
  • APP攻防——Xpoesd proxifier 抓取数据包
  • Java设计模式中的创建者模式/单例模式是啥?单例模式其中的饿汉式与懒汉式又是啥?又可以用在哪些地方
  • 过年了,怎么样批量爬取某东商品信息,并做可视化
  • 来自 GitHub 2022 的趋势和见解
  • 机器学习--多层感知机、卷积神经网络、循环神经网络
  • “五一”假期全国口岸日均出入境人员将达215万人次
  • 四川落马厅官周海琦受审,1000余人接受警示教育
  • 在上海生活8年,13岁英国女孩把城市记忆写进歌里
  • 葛兰西的三位一体:重提并复兴欧洲共产主义的平民圣人
  • 天津外国语大学原校长修刚突发疾病去世,享年68岁
  • 理想汽车副总裁刘杰:不要被竞争牵着鼻子走,也不迷信护城河