题解 | #表示数值的字符串#

表示数值的字符串

https://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8

class Solution {
public:

    bool isNumeric(char c)
    {
        if (c >= '0' && c <= '9') 
        {
            return true;
        }
        return false;
    }

    bool isNumeric(string str) 
    {
        //空串
        if (str.empty()) 
        {
            return false;
        }

        //去掉前空格
        int i = 0;
        for(i = 0;i < str.length();i++)
        {
            if (str[i] != ' ') 
            {
                break;
            }
        }

        str = str.substr(i,str.length() -i);
        if (str.empty()) 
        {
            return false;
        }

        //去掉后空格
        for(i = str.length() - 1; i >= 0; i--)
        {
            if (str[i] != ' ') 
            {
                break;
            }
        }

        str = str.substr(0,i + 1);
        if (str.empty()) 
        {
            return false;
        }

        //去掉 + - 号
        if (str[0] == '+' || str[0] == '-') 
        {
            str = str.substr(1,str.length() - 1);
            if (str.empty()) 
            {
                return false;
            }
        }

        //数字和'e','.'的处理

        bool flag1 = false;
        bool flag2 = false;
        for(i = 0;i < str.length();i++)
        {
            //前后至少有一个的数字
            if (str[i] == '.') 
            {
                //'.'只能出现一次 以及 小数点后面不能有e
                if (flag1 || flag2) 
                {
                    return false;
                }

                flag1 = true;

                if (i >= 1 && isNumeric((char)str[i-1]))
                {
                    continue;
                }

                if (i + 1 < str.length() && isNumeric((char)str[i + 1]))
                {                
                    continue;
                }

                return false;
            }

            //前后都要是数字(后面的数字可以带正负号)
            if (str[i] == 'e' || str[i] == 'E') 
            {
                //'e'只能出现一次
                if (flag2) 
                {
                    return false;
                }

                flag2 = true;

                  //前面的数字可以是小数
                if (i >= 1 && (isNumeric((char)str[i-1]) || str[i-1] == '.'))
                {
                    //后面的数字可以带正负号
                    if (str[i + 1] == '-' || str[i + 1] == '+') 
                    {
                        //跳过这个字符的检查
                       i++;
                    }

                    if(i + 1 < str.length() && isNumeric((char)str[i + 1]))
                    {
                        continue;
                    }   
                } 


                return false;
            }

            //其他的只能是数字 
            if(!isNumeric((char)str[i]))
            {
                return false;
            }
        }

        return true;
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务