zoukankan      html  css  js  c++  java
  • 剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是

    1 题目描述

      请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

    2 思路和方法

      (1)表示数值的字符串遵循模式 A[.[B]][e|EC] 或者.[B][e|EC] ,其中A为数值的整数部分,B为小数点后数值的小数部分,C紧跟着’e’和’E’为数值的指数部分。注:小数点前可以有数字也可以没有数字。

        将整个过程分为三个步骤

        1)先扫描数值的整数部分;首先取首位的符号,扫描整数部分A

        2)如果遇到小数点’.’,开始扫描小数部分B

        3)如果遇到’e’和’E’,开始扫描直属部分C

      (2)注意表示数值的字符串遵循的规则;在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位,表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。

    3 C++核心代码

    (1)

     1 class Solution {
     2 public:
     3     int index=0;
     4     bool isNumeric(char* string)
     5     {        
     6         if(!string) return false;
     7         //数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是
     8         //整数(可以有正负号,也可以没有),而B是一个无符号整数
     9         bool flag=scanInteger(string);
    10         if(index<strlen(string) && string[index]=='.'){
    11             index++;
    12             flag=scanUnsignedInteger(string) || flag;//这里用||的原因,.前面后面可以不跟着数字。注:这里flag一定要放在||后面!!
    13         }
    14         if(index<strlen(string) && (string[index]=='e' || string[index]=='E')){
    15             index++;
    16             flag=flag && scanInteger(string);//这里用&&的原因,e|E前面后面都必须要有数字
    17         }
    18         return flag && index==strlen(string);//注:index==strlen(string)一定要加!!反例1a123
    19     }
    20     bool scanInteger(char* string){//扫描+或-或空起始的0-9的数位,对应A,C
    21         if(index<strlen(string) && (string[index]=='+' || string[index]=='-'))
    22             index++;
    23         return scanUnsignedInteger(string);//true表示存在A或C
    24     }
    25     bool scanUnsignedInteger(char* string){//扫描0-9的数位,对应B
    26         int start=index;
    27         while(index<strlen(string) && string[index]>='0' && string[index]<='9')
    28             index++;
    29         return index>start;//true表示存在B
    30     }
    31 
    32 };
    View Code

    (2)

     1 //注意表示数值的字符串遵循的规则;
     2 //在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位
     3 //表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
     4 class Solution {
     5 public:
     6     bool isNumeric(char* string)
     7     {
     8         if(string==NULL or *string=='')
     9             return false;
    10         if(*string=='+'||*string=='-')
    11             string++;
    12         int dot=0,num=0,nume=0;
    13         while(*string != ''){
    14             if(*string>='0' && *string<='9'){
    15                 string++;
    16                 num =1;
    17             }
    18             else if(*string=='.'){
    19                 if(dot>0||nume>0)
    20                     return false;
    21                 string++;
    22                 dot = 1;
    23             }
    24             else if(*string=='e' || *string=='E'){
    25                 if(nume>0||num==0)
    26                     return false;
    27                 string++;
    28                 nume++;
    29                 if(*string=='+' || *string=='-')
    30                     string++;
    31                 if(*string=='')
    32                     return false;
    33             }
    34             else
    35                 return false;
    36         }
    37         return true;
    38     }
    39 };
    View Code

    参考资料

    https://blog.csdn.net/fuqiuai/article/details/88198099

    https://blog.csdn.net/u012477435/article/details/83351659#_873

  • 相关阅读:
    启动窗体的程序控制与动画效果
    在线程中使用定时器
    从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中
    收集:PowerDesigner常见问题解决与设置集锦
    [转]C# 2.0新特性与C# 3.5新特性
    COM服务器的创建过程
    [原创] 为什么需要TLS(Thread Local Storage)?
    COM+服务器的.Net组件实现 客户端
    如何在客户端避免繁冗的服务器GUID定义及导入?
    进程、线程、套间和环境
  • 原文地址:https://www.cnblogs.com/wxwhnu/p/11429020.html
Copyright © 2011-2022 走看看