题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解法一:
找到字符’e’ 或者 ‘E’,把字符串分为两段,分别判断
- 字符左边:满足要求(1)小数点只能出现一次 (2)加减号只能出现在最开始,且不能连着出现两个 (3)不能出现除数字、加减号、小数点以外的其它任何字符
- 字符右边:满足要求(1)加减号只能出现在最开始且不能连续出现 (2)不能出现小数点 (3)不能出现除数字、加减号以外的其它任何字符
class Solution {
public:
bool isNumeric(char* string)
{
if (*string == '\0')
return false;
int eIndex = 0;
int eflag = 0;
int opflag = 0;
int puflag = 0;
for (char *str = string; *str != '\0'; str++)
{
if (isalpha(*str))
{
if (*str == 'e' || *str == 'E')
{
eflag = 1;
break;
}
else
return false;
}
eIndex++;
}
if (eflag == 1)
{
if (eIndex == 0)
return false;
if (string[eIndex + 1] == '\0')
return false;
for (int i = 0; i < eIndex; i++)
{
//operator
if (*string == '+' || *string == '-')
{
if (opflag == 0)
{
opflag = 1;
string++;
}
else
return false;
}
//number
else if (isdigit(*string))
{
string++;
}
//dot
else if (ispunct(*string))
{
if (*string != '.')
return false;
else
{
if (puflag != 0)
return false;
string++;
}
}
opflag = 1;
}
string++;
}
opflag = 0;
for (; *string != '\0'; string++)
{
if (isalpha(*string))
{
return false;
}
else if (*string == '+' || *string == '-')
{
if (opflag == 0)
{
opflag = 1;
}
else
return false;
}
else if (isdigit(*string))
{
}
else if (ispunct(*string))
{
if (eflag == 1 || *string != '.')
return false;
}
opflag = 1;
}
return true;
}
};
大家也能看到,里边有很多重复性的动作,所以我对代码进行了一下精简。
class Solution {
public:
bool isNumeric(char* string)
{
if (*string == '\0')
return false;
int eflag = 0;
int opflag = 0;
int puflag = 0;
if (*string == 'e' || *string == 'E')
return false;
for (; *string != '\0'; string++)
{
if (*string == '+' || *string == '-')
{
if (opflag)
return false;
}
else if (*string == 'e' || *string == 'E')
{
if (eflag || *(string + 1) == '\0')
return false;
eflag = 1;
opflag = 0;
puflag = 1;
continue; //这个continue一定要留着
}
else if (*string == '.')
{
if (puflag || eflag )
return false;
else
puflag = 1;
}
else if (*string < '0' || *string > '9')
{
return false;
}
opflag = 1;
}
return true;
}
};
看了牛客高赞解法,觉得大同小异,就不摘抄了。