解法一
注意边界条件
1.从第一个不为空格的字符到最后一个不为空格的字符,中间不得出现任何空格。
2.’.’ 只能出现一次,而且不可以出现在 ‘e’ 的后面,且紧贴着 ‘.’ 的左边或者右边或者两边必须有数字(也就是不能是一个单独的 ‘.’)。
3.‘e’ 只能出现一次,而且紧贴着 ‘e’ 的左边必须有数字。
4.’+’ 和 ‘-’ 要么在第一位,要么紧随 ‘e’ 后。
5.最后一位不可以是 ‘e’ 或 ‘+’ 或 ‘-’。
class Solution {
public:
bool isNumber(string s) {
if(s.empty()) return false;
bool isDot=false,isE=false,isNum=false;
while (s.size()>0 && s[0]==' ') s.erase(0,1);
while (s.size()>0 && s[s.size()-1]==' ') s.erase(s.size()-1,1);
if(s.size()==0) return false;
for (int i = 0; i < s.size(); i++)
{
if(s[i]==' ') return false;
else if(s[i]>='0' && s[i]<='9') isNum = true;
else if(s[i]=='e' || s[i]=='E'){
if( isE || !isNum || i==s.size()-1) return false;
s[i]='e';
isE = true;
}
else if(s[i]=='+' || s[i]=='-'){
if( (i>0 && s[i-1]!='e') || i==s.size()-1) return false;
}
else if(s[i]=='.'){
if(isDot || isE || (i==s.size()-1 && !isNum)) return false;
isDot = true;
}
else return false;
}
return true;
}
};
解法二
正则
class Solution {
public boolean isNumber(String s) {
s = s.trim();
//排除三种情况。 空串,e前没有数字,只有.
String regex = "\\s*|([+-]?\\.?[eE][\\s\\S]*)|([+-]?\\.)";
if (s.matches(regex)) return false;
//对不是特殊情况的字符串,进行正则匹配
regex = "(([+-])?\\d*\\.?\\d*)([eE][+-]?\\d+)?";
return s.matches(regex);
}
}
作者:luo-ma-zhong-xia
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/lai-ba-zheng-ze-yi-tao-gao-ding-by-luo-m-ay8c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。