模拟
面向测试用例的编程,想象到了工程开发的画面。改需求,代码也可以精简!
首先判断首位正负号,去除正负号,如果只有一个正负号字符,false。
判断
′
.
′
'.'
′.′ ,如果是单独的
′
.
′
'.'
′.′ ,false ,如果
′
.
′
'.'
′.′ 后面有
′
e
′
'e'
′e′ 或
′
E
′
'E'
′E′ ,false。
维护两个变量,记录
′
.
′
'.'
′.′ 和
′
e
′
'e'
′e′ 出现的次数,进入循环。
遇到
′
.
′
'.'
′.′ ,如果
′
.
′
'.'
′.′ 出现过,false。
遇到
′
e
′
'e'
′e′,如果
′
e
′
'e'
′e′ 出现过,或者
′
e
′
'e'
′e′ 在首位或者最后一位,false。
′
e
′
'e'
′e′ 后可接正负号,如果正负号在最后一位,false。
遇到非数字,false。
逃出循环,true。
class Solution {
public:
bool isNumber(string s) {//模拟
if('+'==s[0]||'-'==s[0]) s = s.substr(1);
if(s.empty()) return false;
int dot = 0, e= 0;
if('.'==s[0]&&(1==s.size()||s[1]=='e')) return false;
for(int i = 0;i<s.size();i++){
if('.'==s[i]){
if(e>0||dot>0) return false;
dot++;
}else if('e'==s[i]||'E'==s[i]){
if(e>0||0==i||i==s.size()-1) return false;
e++;
if('-'==s[i+1]||'+'==s[i+1]){
i++;
if(s.size()-1==i) return false;
}
}else if (s[i]>'9'||s[i]<'0') return false;
}
return true;
}
};
时间复杂度 O ( n ) O(n) O(n) , 一次遍历字符串的时间复杂度 O ( n ) O(n ) O(n) 。
空间复杂度 O ( 1 ) O(1) O(1) ,只使用了常量级空间。
致语
理解思路不重要,我也是面向测试用例编程。
欢迎读者在评论区留言,答主看到就会回复的。