剑指53-表示数值的字符串
状态分析
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
解法
分析所有会出现的情况,并指定是数值的条件
- “e”或”E”后面只能跟”+””-“和数字,而且不能在开头,不能出现重复的”e”
- “.”后面只能跟数字或者”e”和”E”,或在末尾,”.”前面不能出现”e”且”.”不能重复
- “+””-“后面能跟数字或者”.”
- 数字后面跟”.”或者”e”和”E”,或者数字,或者在最后
- 不属于以上符号返回false
边界条件
边界条件1:有多个”.”或者多个”e”(如1.2.3)
边界条件2:”.”在”e”之后(如123e+1.2)
解决: 使用两个bool变量point和exp控制,当出现了”.”之后不能再出现”.”,当出现了”e”之后不能再出现”e”或”.”
代码
class Solution {
public:
bool isNumeric(char* string)
{
//e或E后面只能跟+-和数字,而且不能在开头,不能出现重复的e
//.后面只能跟数字或者e和E.或在末尾,.前面不能出现e且.不能重复
//+-后面能跟数字或者.
//数字后面跟.或者e和E,或者数字,或者在最后
//不属于以上符号返回false
//边界条件:有多个.或者多个e(1.2.3)
//边界条件:.在e之后(123e+1.2)
int lenth = strlen(string);
bool point = false, exp = false; //边界条件控制
for (int i = 0; i < lenth; i++)
{
if (string[i] == 'e' || string[i] == 'E')
{
if (!exp && i != 0 && i + 1 < lenth && (string[i + 1] == '+' || string[i + 1] == '-' || isdigit(string[i + 1])))
{
exp = true;
continue;
}
else return false;
}
else if (string[i] == '.')
{
if (!exp && !point && i != 0 && (i + 1 < lenth && (string[i + 1] == 'e' || string[i + 1] == 'E' || isdigit(string[i + 1]))))
{
point = true;
continue;
}
else if (!exp && !point && i == lenth - 1) return true;
else return false;
}
else if (string[i] == '+' || string[i] == '-')
{
if (i + 1 < lenth && (isdigit(string[i + 1]) || string[i + 1] == '.'))
{
continue;
}
else return false;
}
else if (isdigit(string[i]))
{
if (i + 1 < lenth && (string[i + 1] == '.' || string[i + 1] == 'e' || string[i + 1] == 'E' || isdigit(string[i + 1])))
{
continue;
}
else if (i == lenth - 1) return true;
else return false;
}
else return false;
}
return true;
}
};