领扣 65. 有效数字

验证给定的字符串是否为数字。

例如:
“0” => true
" 0.1 " => true
“abc” => false
“1 a” => false
“2e10” => true

说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。
我的提交 28ms

bool deal_blank(int i,string &s)
{
    for(i=i+1;i<s.length();i++)
            if(s[i]!=' ') return false;
    return true;
}
bool deal_e(int j,string &s)
{
    if(j+1==s.length()) return false;
    else
    {
         if(s[j+1]=='-'||s[j+1]=='+')
         {
             if(j+2==s.length())  return false;
             else
                 j++;
         }
        if(s[j+1]==' ') return false;
        for(j=j+1;j<s.length();j++)
        {
             
            if(!(s[j]>='0'&&s[j]<='9')) 
            {
                if(s[j]==' ')
                    return deal_blank(j,s);
                return false;
            }
        }
          return true;
    }
}
bool deal_point(int i,string &s)
{
    for(int j=i+1;j<s.length();j++)
    {
        
        if(!(s[j]>='0'&&s[j]<='9')) 
        {
            if(s[j]==' ')
                return deal_blank(j,s);
            if(s[j]=='e'||s[j]=='E')
                return deal_e(j,s);
            return false;
        }
    }
    return true;
}
class Solution {
public:
    bool isNumber(string s) {
        
        if(s.length()==0) return false;
        int i=0;
        if(s[0]==' ')
        {
            for(;i<s.length();i++)
            {
                if(s[i]!=' ') break;
            }
        }
        if(s[i]=='-'||s[i]=='+')
        {
            if(s.length()==i+1) return false;
            else
                i++;
        }
        if(s[i]>='0'&&s[i]<='9')
        {
            
            if(s.length()==i+1) return true;
            else
            {
                for(i=i+1;i<s.length();i++)
                {
                    
                    if(!(s[i]>='0'&&s[i]<='9'))
                    {
                        if(s[i]==' ')
                           return deal_blank(i,s);
                        if(s[i]=='.')
                           return deal_point(i,s);
                        if(s[i]=='e'||s[i]=='E')
                            return deal_e(i,s);
                        return false;
                    }
                }
                return true;
            }
                
        }
        else if(s[i]=='.')
        {
            if(s.length()==i+1) return false;
            if(!(s[i+1]>='0'&&s[i+1]<='9')) return false;
            return deal_point(i,s);
        }
        else
            return false;
    }
};

网上发现的精简版本 28ms

所有的字符可以分为六大类,空格,符号,数字,小数点,自然底数和其他字符,我们需要五个标志变量,num, dot, exp, sign分别表示数字,小数点,自然底数和符号是否出现,numAfterE表示自然底数后面是否有数字,那么我们分别来看各种情况:

  • 空格: 我们需要排除的情况是,当前位置是空格而后面一位不为空格,但是之前有数字,小数点,自然底数或者符号出现时返回false。

  • 符号:符号前面如果有字符的话必须是空格或者是自然底数,标记sign为true。

  • 数字:标记num和numAfterE为true。

  • 小数点:如果之前出现过小数点或者自然底数,返回false,否则标记dot为true。

  • 自然底数:如果之前出现过自然底数或者之前从未出现过数字,返回false,否则标记exp为true,numAfterE为false。

  • 其他字符:返回false。

最后返回num && numAfterE即可。

class Solution {
public:
    bool isNumber(string s) {
        bool num = false, numAfterE = true, dot = false, exp = false, sign = false;
        int n = s.size();
        for (int i = 0; i < n; ++i) {
            if (s[i] == ' ') {
                if (i < n - 1 && s[i + 1] != ' ' && (num || dot || exp || sign)) return false;
            } else if (s[i] == '+' || s[i] == '-') {
                if (i > 0 && s[i - 1] != 'e' && s[i - 1] != ' ') return false;
                sign = true;
            } else if (s[i] >= '0' && s[i] <= '9') {
                num = true;
                numAfterE = true;
            } else if (s[i] == '.') {
                if (dot || exp) return false;
                dot = true;
            } else if (s[i] == 'e') {
                if (exp || !num) return false;
                exp = true;
                numAfterE = false;
            } else return false;
        }
        return num && numAfterE;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42054167/article/details/86161013