剑指 Offer 20. 表示数值的字符串
思路:模拟遍历
-
去掉首尾空格
-
定义标志num,dot,exp
-
遍历字符串
- 若出现有效字符之外的字符,直接返回false
- 若当前字符是数字,设置num为true
- 若当前字符是
.
- 如果出现在
E和e
或.
后,即dot或exp为true,返回false - 设置dot为true
- 如果出现在
- 若当前字符是
E或e
- 若之前没出现数字或者已经出现
E或e
,即num为false或exp为true,返回false - 设置exp为true,num为false,因为e后必须有数字
- 若之前没出现数字或者已经出现
- 若当前字符是
+和-
,判断是首字符或者e之后的首字符
-
遍历完成,num是结果
class Solution {
public:
bool isNumber(string s) {
int startIdx=0,endIdx=s.size()-1;
while(startIdx<=endIdx&&s[startIdx]==' ')startIdx++;
while(startIdx<=endIdx&&s[endIdx]==' ')--endIdx;
if(startIdx>endIdx) return false;
bool dot=false,num=false,exp=false;
for(int i=startIdx;i<=endIdx;++i){
if(s[i]>='0'&&s[i]<='9'){
num=true;
}
else if(s[i]=='.'){
if(dot||exp)
return false;
dot=true;
}
else if(s[i]=='e'||s[i]=='E'){
if(exp||!num)
return false;
exp=true;
num=false;
}
else if(s[i]=='+'||s[i]=='-'){
if(i!=startIdx&&s[i-1]!='E'&&s[i-1]!='e')
return false;
}
else return false;
}
return num;
}
};
时间复杂度 O(n)
空间复杂度 O(1)