剑指offer:面试题54——表示数值的字符串
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路:表示数值的字符的正则遵循如下模式:
【符号】整数数值【.【小数数值】】【e或者E【符号】整数数值】
其中【】号为可选部分
因此在分析时候,可以使用if判断,主要分为几部分,判断是否有符号且符合整数格式,判断是否有点并且符合小数格式,判断是否是符合指数格式
class Solution {
public:
void scanDigit(char** str)
{
while(**str>='0'&&**str<='9'&&**str!='\0')
++(*str);
}
public:
bool isExponential(char** string)
{
if(**string!='e'&&**string!='E')
return false;
++(*string);
if(**string=='+'||**string=='-')
++(*string);
if(**string=='\0')
return false;
scanDigit(string);
return (**string=='\0')?true:false;
}
public:
bool isNumeric(char* string)
{
if(string==NULL||!strcmp(string,""))
return false;
if(*string=='+'||*string=='-')
++string;
if(*string=='\0')
return false;
bool numeric=true;
scanDigit(&string);
if(*string!='\0')
{
if(*string=='.')
{
++string;
scanDigit(&string);
if(*string=='e'||*string=='E')
{
numeric=isExponential(&string); //判断是否是小数
}
}
else if(*string=='e'||*string=='E')
numeric=isExponential(&string);
else
numeric=false;
}
return numeric&&*string=='\0';
}
};