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

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

可以用有限自动机
也可以暴力去做,就是提交的次数有点多,我提交了20次。不停的测试所有的边界条件
大体思路是
先判断有没有e
1.有e则用substr()得到前后两个数字str1,str2
2.没有e得到s

写两个判断函数judge1,judge2
judge1:判断小数,整数
judge2:判断整数

结果
1.judge1(str1)&&judge2(str2)
2.judge1(s)

代码

class Solution {
public:
    bool judge1(string s)
    {
        int count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='+'||s[i]=='-')
                count++;
        }
        if(count>1)
            return false;
        if(count==1)
        {
            if(s[0]=='+'||s[0]=='-')
            {
                s=s.substr(1,s.length()-1);
            }else
            {
                return false;
            }
        }
        count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='.')
                count++;
        }
        if(count>1)
            return false;
        else if(count==1)
        {
            int index;
            for(int i=0;i<s.length();i++)
            {
                if(s[i]=='.')
                    index=i;
            }

            if(index==0)
            {
                if(s.length()==1)
                    return false;
                else
                {
                    if(s[1]>'9'||s[1]<'0')
                        return false;
                }
            }else if(index==s.length()-1)
            {
                if(s.length()==1)
                    return false;
                else
                {
                    if(s[index-1]>'9'||s[index-1]<'0')
                        return false;
                }
            }
            else{
                if(s[index+1]<='9'&&s[index+1]>='0'&&s[index-1]<='9'&&s[index-1]>='0')
                {

                }else
                {
                    return false;
                }
            }
        }else
        {
            if(s.length()==0)
                return false;
        }
        return true;
    }

    bool judge2(string s)
    {
        int count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='+'||s[i]=='-')
                count++;
        }
        if(count>1)
            return false;
        if(count==1)
        {
            if(s[0]=='+'||s[0]=='-')
            {
                if(s.length()==1)
                    return false;
            }else
            {
                return false;
            }
        }
        count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='.')
                count++;
        }
        if(count>0)
            return false;
        return true;
    }



    bool isNumber(string s) {
        while(s.length()>0)
        {
            if(s[s.length()-1]==' ')
                s=s.substr(0,s.length()-1);
            else
                break;
        }

        while(s.length()>0)
        {
            if(s[0]==' ')
                s=s.substr(1,s.length()-1);
            else
                break;
        }

        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='+'||s[i]=='-'||s[i]=='.'||s[i]=='e'||s[i]=='E'||(s[i]>='0'&&s[i]<='9'))
            {

            }else
            {
                return false;
            }
        }

        int count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]>='0'&&s[i]<='9')
                count++;
        }
        if(count==0)
            return false;

        count=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='e'||s[i]=='E')
                count++;
        }
        bool flag=true;
        if(count>1)
            return false;
        else if(count==1)
        {
            if(s.length()<3)
                return false;
            else
            {
                int index=0;
                for(int i=0;i<s.length();i++)
                {
                    if(s[i]=='e'||s[i]=='E')
                        index=i;
                }
                string str1=s.substr(0,index);
                string str2=s.substr(index+1,s.length()-index-1);
                if(str1.length()==0||str2.length()==0)
                    return false;
                flag=judge1(str1)&&judge2(str2);
            }

        }else
        {
            flag=judge1(s);
        }
        return flag;
    }
};
posted @ 2020-10-12 18:00  韩天尊  阅读(81)  评论(0)    收藏  举报