题目:
Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
解析:
这题难度不大,主要是细节要考虑全面。
因为有字母e,所以以字母e为界,左边为一部分,右边为一部分,分别对这两部分进行判断。这两部分均为数字且右侧不能为小数,则为真,否则为假。
若没有数字则直接对字符串进行判断。
可能为数字的一些情况考虑到位,比如“+4.”,“.1”,“-.2”均为有效数字
代码:
class Solution {
public:
bool isnum(string s,int start,int end) //判断是否为数字
{
if(start>end)return false;
int i=start;
int countdot=0;
while(i<=end)
{
if((s[i]=='-'||s[i]=='+')&&i==start)
{
if((end-start==1)&&s[i+1]>='0'&&s[i+1]<='9')i++;
else if(end-start>1)i++;
else return false;
}
else if(s[i]>='0'&&s[i]<='9')i++;
else if(s[i]=='.'&&(end-start)>0)
{
countdot++;
if(countdot>1)return false;
i++;
}
else return false;
}
if(start>0&&countdot>0)return false; //字母e右侧不能为小数
return true;
}
bool isNumber(string s) {
for(auto it=s.begin();it!=s.end();)
{
if(*it==' ')
{
s.erase(it);
continue;
}
else break;
++it;
}
for(auto it=--s.end();it!=s.begin();--it)
{
if(*it==' ')
{
s.erase(it);
continue;
}
else break;
}
if(s.empty())return false;
int n=s.size();
for(int i=0;i<n;i++)
{
if(s[i]=='e')
return isnum(s,0,i-1)&&isnum(s,i+1,n-1);
else if(s[i]=='.'||(s[i]>='0'&&s[i]<='9')||(s[i]=='-'||s[i]=='+'))continue;
else return false;
}
return isnum(s,0,n-1);
}
};