其他分享
首页 > 其他分享> > 有效数字

有效数字

作者:互联网

 

 

 

详细思路

分类讨论,+-只能在首尾或者e下一位,遇到E,只能有一个,前面必须有数字,后面必须也有数字,小数点只能有一个,前面不能有E
class Solution {
public:
    bool hasE, hasNum, hasFloat; 
    bool isNumber(string& s) {
        for(int i = 0; i < s.size(); i++) {
            // 符号位只能在首位或E的后一位
            if((s[i] == '-' || s[i] == '+') && (i == 0 || s[i - 1] == 'e' || s[i - 1] == 'E'))continue;
            else if((s[i] == 'e' || s[i] == 'E') && !hasE && hasNum) {
            //只存在一个E, 前面必须有数字, 后面也必须有数字
                hasE = true;
                hasNum = false;
            }else if(s[i] == '.' && !hasFloat && !hasE) {
            //只存在一个小数点, 不能在E的后面
                hasFloat = true;
            }else if(isdigit(s[i])) {
                hasNum = true;
            }else return false;
        }
        return hasNum;
    }
};
详细思路 正则表达式
class Solution {
public:
    static const regex pattern;
    bool isNumber(string str) {
        return regex_match(str, pattern);
    }
};
const regex Solution::pattern((小数)|(整数)|(((小数)|(整数))[eE](整数)));
整数:[+-]?\\d+
小数:[+-]?((1)|(2)|(3))
1:\\d+\\.
2:\\d+\\.\\d+
3:\\.\\d+

代入之后

class Solution {
public:
    static const regex pattern;
    bool isNumber(string str) {
        return regex_match(str, pattern);
    }
};
const regex Solution::pattern("([+-]?((\\d+\\.)|(\\d+\\.\\d+)
|(\\.\\d+)))|([+-]?\\d+)|((([+-]?((\\d+\\.)|(\\d+\\.\\d+)
|(\\.\\d+)))|([+-]?\\d+))[eE]([+-]?\\d+))");

踩过的坑
c++ 用正则表达式记得作为类的静态变量或全局变量,避免重复构造的开销,否则会超时

 

标签:regex,有效数字,pattern,Solution,+-,&&,hasNum
来源: https://www.cnblogs.com/zhouzihong/p/15075277.html