表示数值的字符串

1.个人觉得牛客网这个答案比较容易理解

思路:用for循环遍历: 判断各种会出错的情况 报false;如果能过五关斩六将走到最后,那么就是true

注意判断顺序!!

1)e后面应该接数字 (如果e是最后一个数,报错)

2)不能同时存在两个e

3)+ - 所在的位置,只可可能位于首位或者位于e后面;

4)e后面不可以有小数点  小数点只可能有一次  不可能出现2次

5)如果字符其他数字的部分,有出现<'0' 或者     >'9',那么是无效的;

class Solution {
public:
    bool isNumeric(char* str) {
        // 标记符号、小数点、e是否出现过
        bool sign = false, decimal = false, hasE = false;
        for (int i = 0; i < strlen(str); i++) {
            if (str[i] == 'e' || str[i] == 'E') {
                if (i == strlen(str)-1) return false; // e后面一定要接数字
                if (hasE) return false;  // 不能同时存在两个e
                hasE = true;
            } else if (str[i] == '+' || str[i] == '-') {
                // 第二次出现+-符号,则必须紧接在e之后
                if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false;
                // 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后
                if (!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') return false;
                sign = true;
            } else if (str[i] == '.') {
              // e后面不能接小数点,小数点不能出现两次
                if (hasE || decimal) return false;
                decimal = true;
            } else if (str[i] < '0' || str[i] > '9') // 不合法字符
                return false;
        }
        return true;
    }
};
class Solution {
public:
    bool isNumeric(char* string)
    { // 标记符号、小数点、e是否出现过
       bool sign=false,decimal=false,hasE=false;  //默认没出现
         for(int i=0;i<strlen(string);i++)//遍历;
         {
        //判断e后应接数字  不能存在两个e
        if(string[i]=='e'||string[i]=='E')
         {
           if(i==strlen(string)-1) //最后一位‘
           return false;                   //直接返回错误
           if(hasE)//第一次进肯定是false 不会进  //下一次再进来证明有两个e  保错
           return false; 
           hasE=true;
         }
        else if(string[i]=='-'||string[i]=='+')
        {
            // 第二次出现+-符号,则必须紧接在e之后
            if(sign&&string[i-1]!='e'&&string[i-1]!='E')//sign=true 已经存在了
              return false;
            //首次出现符号 既不在开头,它前面也无e
            if(!sign&&i>0&&string[i-1]!='e'&&string[i-1]!='E')
             return false;
            sign=true; //if条件进来了他就有符号
        }
         else if(string[i]=='.')
         {
          if (hasE||decimal)//小数点出现两次    //这里不太懂 为什么有e  //懂了  说明这里的遍历已经在e之后了
            return false;
        
             decimal=true;   
         }
         else if(string[i]<'0'||string[i]>'9')//非法输入
         {
           return false;  
         }   
 
             
       }
   return true;  //没有任何问题 走到最后一步
        
    }

};
原文地址:https://www.cnblogs.com/cgy1012/p/11382049.html