• Valid Number


    Validate if a given string is numeric.

    Some examples:
    "0" => true
    " 0.1 " => true
    "abc" => false
    "1 a" => false
    "2e10" => true

    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

    class Solution {
    private:
        //1234
        bool isonlydigits(const string& s,int l,int r)
        {
            if(l>r) return false;
            
            for(int i=l;i<=r;i++)
                if(s[i]<'0' || s[i]>'9'return false;  
            return true;
        }
        //+ -
        bool isnum(const string& s,int l,int r)
        {
            if(l>r)return false;
            if(s[l]=='+' || s[l]=='-'return isnum(s,l+1,r);
            return isonlydigits(s,l,r);
        }
        //0.22
        bool isposfloat(const string& s,int l,int r)
        {
            if(l>r)return false;

            if(s[l]=='.'return isonlydigits(s,l+1,r);
            if(s[r]=='.'return isonlydigits(s,l,r-1);
            for(int i=l+1;i<=r-1;i++)
            if(s[i]=='.')
                return isonlydigits(s,l,i-1) && isonlydigits(s,i+1,r);
            return isonlydigits(s,l,r);
        }
        //+- 0.22
        bool isfloat(const string& s,int l,int r)
        {
            if(l>r)return false;

            if(s[l]=='+' || s[l]=='-'return isposfloat(s,l+1,r);
            return isposfloat(s,l,r);
        }
    public:
        bool isNumber(const char *s) 
        {
            //trim
            string str="";
            int len=strlen(s);
            int l=0;
            while(l<len && s[l]==' ') l++;
            int r=len-1;
            while(r>=0 && s[r]==' ') r--;
            for(int i=l;i<=r;i++)
                str=str+s[i];
            //only 1-9 . e + -
            for(int i=0;i<str.length();i++)
            {
                if(str[i]>='0' || str[i]<='9' || str[i]=='.' 
                || str[i]=='+' || str[i]=='-' || str[i]=='e' || str[i]=='E')
                {
                    
                }
                else return false;
            }
            //split by e
            for(int i=0;i<str.length();i++)
            if(str[i]=='e' || str[i]=='E')
            {
                return isfloat(str,0,i-1) && isnum(str,i+1,str.length()-1);
            }
            //no e
            return isfloat(str,0,str.length()-1);
        }
    }; 
  • 相关阅读:
    PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
    PAT 甲级 1050 String Subtraction (20 分) (简单送分,getline(cin,s)的使用)
    PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***...
    PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)
    PAT 甲级 1047 Student List for Course (25 分)(cout超时,string scanf printf注意点,字符串哈希反哈希)...
    PAT 甲级 1046 Shortest Distance (20 分)(前缀和,想了一会儿)
    R语言实现金融数据的时间序列分析及建模
    ES6 | class类的基本语法总结
    less使用总结
    umi 的项目中如何修改 favicon
  • 原文地址:https://www.cnblogs.com/erictanghu/p/3759467.html
Copyright © 2020-2023  润新知