剑指 Offer 20. 表示数值的字符串

发布时间 2023-07-19 21:04:36作者: 孜孜不倦fly

题目:

#遇到数字:一定合法
#遇到'.'且合法需要满足条件:之前没出现过'.',之前没出现过'e'
#遇到'e'且合法需要满足条件:之前没出现过'e',之前出现过整数
#遇到'+'或者'-'且合法需要满足条件:位于字符串第一位,或者紧跟在'e'之后  

class Solution {
public:
    bool isNumber(string s) {
        int i=0;
        while(i<s.size()&&s[i]==' '){      #删除前面所有空格
            i++;
        }
        s=s.substr(i);                     #用s=s.substr(i)      从第i位开始的子串代替原字符串
        while(s.back()==' '){              #删除末尾所有空格
            s.pop_back();
        }
        bool numFlag=false;
        bool dotFlag=false;
        bool eFlag=false;
        for(int i=0;i<s.size();i++){
            if(isdigit(s[i])){              #遇到数字,用isdigit()函数判断
                numFlag=true;
            }
            else if(s[i]=='.'&&!dotFlag&&!eFlag){       #遇到'.'且合法:之前没出现过'.',之前没出现过'e'
                dotFlag=true;
            }
            else if((s[i]=='e'||s[i]=='E')&&!eFlag&&numFlag){     #遇到'e'且合法:之前没出现过'e',之前出现过数字
                eFlag=true;
                numFlag=false;                     #因为'e'之后至少要有一个数字,所以numFlag=false
            }
            else if((s[i]=='+'||s[i]=='-')&&(i==0||s[i-1]=='e'||s[i-1]=='E')){       #遇到'+'或者'-'且合法:位于字符串第一位,或者紧跟在'e'之后  

            }
            else{                 #其他情况都违法
                return false;        
            }
        }
        return numFlag;           #出现数字并且一直合法,即为数值
    }
};