剑指offer第53题:表示数值的字符串

剑指offer第53题:表示数值的字符串

题目描述

表示数值的字符串

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

源码

class Solution {
public:
    bool isConNum(char str[],int l,int r)//判断为是否为不带符号的数字
    {
        
       for(int i=l;i<=r;i++)
       {
           if(str[i]<'0' || str[i]>'9')
           return false;
       }
        return true;
    }
    bool isPositiveInteger(char str[],int l,int r)//判断是否为正整数或零
    {
        if(l == r )
        {
            if(str[l]>='0' && str[l]<='9') return true;
            return false;
        }
        if(str[l] == '+')
        {
            return isConNum(str,l+1,r);
        }
        else
        {
            return isConNum(str,l,r);
        }
        
    }
    bool isNegativeInteger(char str[],int l,int r)//判断是否为负整数
    {
        
        if(str[l] == '-')
        {
            return isConNum(str,l+1,r);
        }
         return false;
    }
    bool isInteger(char str[],int l,int r)
    {
        
        return isPositiveInteger(str,l,r) ||isNegativeInteger(str,l,r);

    }
    bool isSmallNumber(char str[],int l ,int r)//判断是否是为小数
    {
        int ind_point = 0;//记录第一个小数点出现的位置;
        for(int i = l;i<=r;i++)
        {
            if(str[i]=='.') 
            {
               ind_point = i;
               break;
            }
        }
        if(ind_point == l || ind_point == r)//若小数点出现在首尾,则不是小数
        {
            return  false;
        }
        //若出现在字符串中间,则判断其左侧是否为整数且右侧为不带符号的整数。
        return isInteger(str,l,ind_point-1)&&isConNum(str,ind_point+1,r);
    }
    bool isFE(char str[],int l,int r)
    {
        int ind_e = 0;
        for(int i = l;i<= r;i++)
        {
            if(str[i] == 'e'|| str[i] == 'E')
            {
                ind_e = i;
                break;
            }
        }
        if(ind_e == l || ind_e == r)//若e出现在首尾,则不是PE.
        {
            return  false;
        }
            //若e出现在字符串中间,则判断其左侧是否为整数且右侧为整数
        return (isInteger(str,l,ind_e-1)||isSmallNumber(str,l,ind_e-1))&&isInteger(str,ind_e+1,r);
        
    }
    
    bool isNumeric(char* string)
    {
        int size = 0;
        char * p = string;
        while(*p != '\0')
        {
            p++;
            size++;
        }
        if(size == 0) return false;
        return isInteger(string,0,size-1)||isSmallNumber(string,0,size-1)||isFE(string,0,size-1);
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值