LeetCode 65. 有效数字(模拟,C++)

LeetCode 65. 有效数字

分析

1.找到字符串中字符’e’或者’E’第一次出现的位置。
2.如果存在字符’e’或者’E’第一次出现的位置,那么可以将字符串分为两部分进行检查是否合法,
‘e‘或者’E’之前的部分可以是整数或者小数,'e’或者’E’之后的部分必须是整数。
3.如果字符’e’和字符’E’都没有出现过,则整个字符串可以是整数,也可以是小数。
4.判断是否是合格的整数或者小数

4.1 正负号只能出现在开头。
4.2 如果要求不一定是整数,字符'.'最多出现一次;如果要求一定是整数,字符'.'不能出现。
4.3 字符串中至少有一个数字。
## 代码
class Solution {
public:
    //solve函数的作用是判断某个字符串是否为合法的数字,s为字符串,must_int标记是否一定是整数
    //注意:这里的形参s必须要有const修饰
    bool solve(const string& s, bool must_int) {
        //e前面部分为空、e后面部分为空以及整个字符串为空
        if (s.empty()) return false;

        //判断第一个字符是否为正负号,如果是,则从下标为1的字符开始遍历;如果不是,则从下标为0的字符开始遍历
        int st = int(s[0] == '+' || s[0] == '-');
        //has_dot标记是否出现过小数点,has_digit标记是否出现过阿拉伯数字
        bool has_dot = false, has_digit = false;

        //开始遍历每一个字符
        for (int i = st; i < s.size(); i++) {
            //如果当前字符是小数点
            if (s[i] == '.') {
                //如果要求一定是整数,则不可以出现小数点;
                if (must_int) return false;
                //如果之前已经出现过小数点,也是false
                if (has_dot) return false;
                has_dot = true;
            } else if (isdigit(s[i])) {
                has_digit = 1;
            } else {
                //除了数字和小数点的其他情况,只能是false
                return false;
            }
        }
        //如果出现过阿拉伯数字,则返回true;否则返回false
        return has_digit;
    }

    bool isNumber(string s) {
        int e_idx = s.find('e');//字符'e'第一次出现的下标
        int E_idx = s.find('E');//字符'E'第一次出现的下标

        if (e_idx != string::npos)
            return solve(s.substr(0, e_idx), false) && solve(s.substr(e_idx + 1), true);
        
        if (E_idx != string::npos)
            return solve(s.substr(0, E_idx), false) && solve(s.substr(E_idx + 1), true);
        
        return solve(s, false);
    }
};
上一篇:bigemap如何安装离线地图发布服务端程序


下一篇:Oracle 11g数据库详细安装步骤图解