题目来源
题目描述
题目解析
模拟
字符串大模拟,根据「有效数字定义」梳理规则即可。
本题有多种解法:「正则」、「DFA」、「模拟」…
「模拟」是在各类场景中最容易实现的方式
将字符串以 e/E 进行分割后,其实规则十分简单:
- 如果存在 e/E :左侧可以「整数」或「浮点数」,右侧必须是「整数」
- 如果不存在 e/E :整段可以是「整数」或「浮点数」
关键在于如何实现一个 check 函数用于判断「整数」或「浮点数」:
- +/- 只能出现在头部
- . 最多出现一次
- 至少存在一个数字
class Solution {
bool check(string &s, int left, int right, bool mustInteger){
if(left > right){
return false;
}
if(s[left] == '+' || s[left] == '-'){
++left;
}
bool hasDot = false, hasNum = false;
for (int i = left; i <= right; ++i) {
if(s[i] == '.'){
if(mustInteger || hasDot){
return false;
}
hasDot = true;
}else if(isdigit(s[i])){
hasNum = true;
}else{
return false;
}
}
return hasNum;
}
public:
bool isNumber(string s) {
// 是否存在e, 记录e存在的位置
bool has_e = false;
int idx = -1;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (s[i] == 'e' || s[i] == 'E'){
if(idx == -1){
idx = i;
}else{
return false;
}
}
}
if(idx == -1){ // 不存在e,E
return check(s, 0, n - 1, false);
}else{
return check(s, 0, idx -1, false) && check(s, idx + 1, n - 1, true);
}
}
};