跳转至

20.表示数值的字符串 (Medium)*

题目描述*

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

代码*

表示数值的字符串模式为 A[.[B]][e|EC],A 为数值的整数部分,B 为数值的小数部分,C 是数值的整数部分。还有就是小数可能没有整数部分,即 .B[e|EC]

A 和 C 都是可能以 +/- 开头的数字串,B 是不能含有符号的数字串。

因此可以分三部分扫描。

class Solution {
public:
    bool isNumber(string s) {
        if(s.length() == 0) {
            return false;
        }
        int len = s.length();
        int left = 0;
        int right = len - 1;
        while(left < len && s[left] == ' ') {
            left++;
        }
        while(right >= 0 && s[right] == ' ') {
            right--;
        }
        if(left > right) {
            return false;
        }
        if(s[left] == '+' || s[left] == '-') {
            left++;
        }
        bool num = false;
        bool hasE = false, hasDot = false;
        for(int i = left; i <= right; i++) {
            if(s[i] >= '0' && s[i] <= '9') {
                num = true;
            }else if(s[i] == '.') {
                if(hasE || hasDot) {
                    return false;
                }
                hasDot = true;
            }else if(s[i] == 'e' || s[i] == 'E') {
                if(hasE || !num || i == right) {
                    return false;
                }
                if(s[i + 1] == '+' || s[i + 1] == '-') {
                    i++;
                }
                hasE = true;
                num = false;
            }else {
                return false;
            }
        }
        return num;
    }
};
class Solution {
public:
    bool isNumber(string s) {
        //1、从首尾寻找s中不为空格首尾位置,也就是去除首尾空格
        int i=s.find_first_not_of(' ');
        if(i==string::npos)return false;
        int j=s.find_last_not_of(' ');
        s=s.substr(i,j-i+1);
        if(s.empty())return false;

        //2、根据e来划分底数和指数
        int e=s.find('e');

        //3、指数为空,判断底数
        if(e==string::npos)return judgeP(s);

        //4、指数不为空,判断底数和指数
        else return judgeP(s.substr(0,e))&&judgeS(s.substr(e+1));
    }

    bool judgeP(string s)//判断底数是否合法
    {
        bool result=false,point=false;
        int n=s.size();
        for(int i=0;i<n;++i)
        {
            if(s[i]=='+'||s[i]=='-'){//符号位不在第一位,返回false
                if(i!=0)return false;
            }
            else if(s[i]=='.'){
                if(point)return false;//有多个小数点,返回false
                point=true;
            }
            else if(s[i]<'0'||s[i]>'9'){//非纯数字,返回false
                return false;
            }
            else{
                result=true;
            }
        }
        return result;
    }

    bool judgeS(string s)//判断指数是否合法
    {   
        bool result=false;
        //注意指数不能出现小数点,所以出现除符号位的非纯数字表示指数不合法
        for(int i=0;i<s.size();++i)
        {
            if(s[i]=='+'||s[i]=='-'){//符号位不在第一位,返回false
                if(i!=0)return false;
            }
            else if(s[i]<'0'||s[i]>'9'){//非纯数字,返回false
                return false;
            }
            else{
                result=true;
            }
        }
        return result;
    }
};

最后更新: July 23, 2022