//判断一个字符串是否能顾表示一个数值
//模拟
class Solution {
private:
int done[10];
public:
Solution()
{
memset(done,0,sizeof(done));
}
~Solution()
{
}
//判断小数部分是否合法
bool judgeDic(int l,int r,char* string)
{
if(string==nullptr||r<l) return false;
//分析:只能由数字构成
for(int i=l;i<=r;i++)
{
if(!isdigit(string[i])) return false;
}
return true;
}
//判断整数部分和指数部分是否合法
bool judgeNumber(int l,int r,char* string)
{
if(string==nullptr||r<l) return false;
//分析:只能由‘+’ ‘-’ 和数字构成
if(string[l]=='+'||string[l]=='-') {
for(int i = l+1;i<=r;i++)
{
if(!isdigit(string[i])) return false;
}
return true;
}
else {
for(int i=l;i<=r;i++)
{
if(!isdigit(string[i])) return false;
}
return true;
}
}
bool isNumeric(char* string)
{
if(string==nullptr||strlen(string)<=0) return false;
int len = strlen(string);
for(int i = 0; i < len ;i ++)
{
if(!isdigit(string[i])&&string[i]!='.'&&string[i]!='E'&&string[i]!='e'&&string[i]!='+'&&string[i]!='-') return false;
if(string[i]=='+') done[0]++;
if(string[i]=='-') done[1]++;
if(string[i]=='.') done[2]++;
if(string[i]=='E') done[3]++;
if(string[i]=='e') done[4]++;
}
if(done[0]>=3||done[1]>=3||done[2]>1||done[3]>1||done[4]>1) return false;
//根据分界线依次判断
//如果没有小数点
if(done[2]==0) {
if(done[3]&&done[4]) {
return false;
}
else {
//有指数部分
if(done[3]||done[4]) {
int index = 0;
while(index<len)
{
if(string[index]=='E'||string[index]=='e') break;
index++;
}
if(index==0) return false;
//判断整数部分是否符合要求
return judgeNumber(0,index-1,string)&&judgeNumber(index+1,len-1,string);
}
else {
//否则,没有指数部分
return judgeNumber(0,len-1,string);
}
}
}
else {
//否则,有小数点
//找到小数点位置 如果有小数点,那么整数部分可以为空
int index=0;
while(index<len)
{
if(string[index]=='.') break;
index++;
}
//判断有无指数部分
if(done[3]&&done[4]) return false;
//有指数部分
if(done[3]||done[4]) {
int pos = 0;
while(pos<len)
{
if(string[pos]=='e'||string[pos]=='E') break;
pos++;
}
if(pos<index) return false;
//判断有无整数部分
if(index==0) {
return judgeDic(index+1,pos-1,string)&&judgeNumber(pos+1,len-1,string);
}
else {
return judgeNumber(0,index-1,string)&&judgeDic(index+1,pos-1,string)&&judgeNumber(pos+1,len-1,string);
}
}
else {
//没有指数部分
if(index==0) {
return judgeDic(index+1,len-1,string);
}
else {
return judgeDic(index+1,len-1,string)&&judgeNumber(0,index-1,string);
}
}
}
}
};