表示数值的字符串 模拟

传送门

//判断一个字符串是否能顾表示一个数值
//模拟
class Solution {
private:
    int done[10];
public:
    Solution()
    {
        memset(done,0,sizeof(done));
    }
    ~Solution()
    {
        
    }
    //判断小数部分是否合法
    bool judgeDic(int l,int r,char* string)
    {
        if(string==nullptr||r<l) return false;
        //分析:只能由数字构成
        for(int i=l;i<=r;i++)
        {
            if(!isdigit(string[i])) return false;
        }
        return true;
    }
    //判断整数部分和指数部分是否合法
    bool judgeNumber(int l,int r,char* string)
    {
        if(string==nullptr||r<l) return false;
        //分析:只能由‘+’ ‘-’ 和数字构成
        if(string[l]=='+'||string[l]=='-') {
            for(int i = l+1;i<=r;i++)
            {
                if(!isdigit(string[i])) return false;
            }
            return true;
        }
        else {
            for(int i=l;i<=r;i++)
            {
                if(!isdigit(string[i])) return false;
            }
            return true;
        }
    }
    bool isNumeric(char* string)
    {
        if(string==nullptr||strlen(string)<=0) return false;
        int len = strlen(string);
        for(int i = 0; i < len ;i ++)
        {
            if(!isdigit(string[i])&&string[i]!='.'&&string[i]!='E'&&string[i]!='e'&&string[i]!='+'&&string[i]!='-') return false;
            if(string[i]=='+') done[0]++;
            if(string[i]=='-') done[1]++;
            if(string[i]=='.') done[2]++;
            if(string[i]=='E') done[3]++;
            if(string[i]=='e') done[4]++;
        }
        if(done[0]>=3||done[1]>=3||done[2]>1||done[3]>1||done[4]>1) return false;
        //根据分界线依次判断
        //如果没有小数点
        if(done[2]==0) {
            if(done[3]&&done[4]) {
                return false;
            }
            else {
                //有指数部分
                if(done[3]||done[4]) {
                    int index = 0;
                    while(index<len)
                    {
                        if(string[index]=='E'||string[index]=='e') break;
                        index++;
                    }
                    if(index==0) return false;
                    //判断整数部分是否符合要求
                    return judgeNumber(0,index-1,string)&&judgeNumber(index+1,len-1,string);
                }
                else {
                    //否则,没有指数部分
                    return judgeNumber(0,len-1,string);
                }
            }
        }
        else {
            //否则,有小数点
            //找到小数点位置 如果有小数点,那么整数部分可以为空
            int index=0;
            while(index<len)
            {
                if(string[index]=='.') break;
                index++;
            }
            //判断有无指数部分
            if(done[3]&&done[4]) return false;
            //有指数部分
            if(done[3]||done[4]) {
                int pos = 0;
                while(pos<len)
                {
                    if(string[pos]=='e'||string[pos]=='E') break;
                    pos++;
                }
                if(pos<index) return false;
                //判断有无整数部分
                if(index==0) {
                    return judgeDic(index+1,pos-1,string)&&judgeNumber(pos+1,len-1,string);
                }
                else {
                    return judgeNumber(0,index-1,string)&&judgeDic(index+1,pos-1,string)&&judgeNumber(pos+1,len-1,string);
                }
            }
            else {
                //没有指数部分
                if(index==0) {
                    return judgeDic(index+1,len-1,string);
                }
                else {
                    return judgeDic(index+1,len-1,string)&&judgeNumber(0,index-1,string);
                }
            }
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值