zoukankan      html  css  js  c++  java
  • 剑指offer:表示数值的字符串

    题目描述:

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

    思路分析:

    1. 第一种思路,是对于这种数值表示形式的特殊情况进行分析,这里一共包括了四种情况,需要设定三个数值来对于符号位的出现,小数点的出现以及e值的出现进行记录。分别使用布尔类型的三个变量:sign,dot,hasE。接下来分析四种特殊情况:

      1)对于符号位'+'和'-'的出现的判断:只能出现在字符串的第一位或e/E的后面第一位。

      2)对于e/E的出现判断:不能出现两次或出现在字符串的最后一位。

      3)对于'.'的出现判断:不能出现两次,不能出现在字符串的最后一位,不能出现的e/E之后。

      4)对于其他字符,只要不是0到9的数字就出错。

    根据上述的特殊情况,对字符串进行一次遍历,当顺利完成遍历即为满足条件的字符串。

    2. 第二种思路,是将整个字符串的形式进行了拆分,可以形式化表示为A[.[B]][e|EC],其中A,B,C表示数字,“|”表示或,[]表示可有可无的部分。

    在数值之前可能有一个表示正负的'+'或者'-'。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学记数法表示,接下来是一个'e'或者'E',以及紧跟着的一个整数(可以有正负号)表示指数。

    这一部分对于字符串的遍历使用了指针,比较灵活,要注意理解p,*p,&p以及**p之间的区别。以及函数调用的过程指针的变化。

    代码:

    思路一:

     1 class Solution {
     2 public:
     3     bool isNumeric(char* string)
     4     {
     5         if(string==nullptr)
     6             return false;
     7         bool sign=false, dot=false, hasE=false;
     8         for(int i=0; i<strlen(string); i++)
     9         {
    10             if(string[i]=='+' || string[i]=='-')
    11             {
    12                 if(!sign && i!=0 && string[i-1]!='e' && string[i-1]!='E')
    13                     return false;
    14                 else if(sign && string[i-1]!='e' && string[i-1]!='E')
    15                     return false;
    16                 sign = true;
    17             }
    18             else if(string[i]=='e' || string[i]=='E')
    19             {
    20                 if(hasE || strlen(string)-1 == i)
    21                     return false;
    22                 hasE = true;
    23             }
    24             else if(string[i] == '.')
    25             {
    26                 if(dot || strlen(string)-1==i || hasE)
    27                     return false;
    28                 dot = true;
    29             }
    30             else if(string[i]>'9' || string[i]<'0')
    31                 return false;
    32         }
    33         return true;
    34     }
    35 
    36 };

    思路二:

     1 class Solution {
     2 public:
     3     bool isNumeric(char* string)
     4     {
     5         if(*string=='' || string==nullptr)
     6             return false;
     7         bool res = true;
     8         if(*string == '+' || *string == '-')
     9             string++;
    10         isDigtal(&string);
    11         if(*string!='')
    12         {
    13             if(*string == '.')
    14             {
    15                 string++;
    16                 isDigtal(&string);
    17                 if(*string == 'e' || *string == 'E')
    18                     res = isExponential(&string);
    19             }
    20             else if(*string == 'e' || *string == 'E')
    21                 res = isExponential(&string);
    22             else
    23                 res = false;
    24         }
    25         return res && *string=='';
    26     }
    27 
    28 private:
    29     void isDigtal(char** string)
    30     {
    31         while(**string !='' && **string>='0' && **string<='9')
    32         {
    33             (*string)++;
    34         }
    35     }
    36     
    37     bool isExponential(char** string)
    38     {
    39         (*string)++;
    40         if(**string=='+' || **string=='-')
    41             (*string)++;
    42         if(**string == '')
    43             return false;
    44         isDigtal(string);
    45         return (**string == '') ? true : false;
    46     }
    47 
    48 };
  • 相关阅读:
    第十一周总结
    代码大全第二版-阅读笔记03
    第十周总结
    第十四周总结
    第十三周总结
    图书管理系统
    《软件需求模式》阅读笔记(三)
    第十二周总结
    语义分析
    第十一周总结
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11104902.html
Copyright © 2011-2022 走看看