题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
题解:
首先要想到所有的情况,然后进行分类讨论.
(1)+-号后面必定为数字或后面为.(-.123 = -0.123)
(2)+-号只出现在第一位或在eE的后一位
(3)后面必定为数字或为最后一位(233. = 233.0)
(4)eE后面必定为数字或+-号
class Solution {
public:
//首先要想到所有的情况,然后进行分类讨论
//+-号后面必定为数字或后面为.(-.123 = -0.123)
//+-号只出现在第一位或在eE的后一位
//后面必定为数字或为最后一位(233. = 233.0)
//eE后面必定为数字或+-号
bool isNumeric(char* string)
{
bool point = false, exp = false; //表示是否为小数点和直属
for(int i=0; i<strlen(string); i++){
if(string[i] == '-' || string[i] == '+'){
if(i+1 == strlen(string) || !(string[i+1] >='0' && string[i+1] <= '9' || string[i+1] == '.')){
// +-号后面必定为数字 或 后面为.(-.123 = -0.123)
return false;
}
if(!(i == 0 || string[i-1] == 'e' || string[i-1] == 'E'))
// +-号只出现在第一位或eE的后一位
return false;
}
else if(string[i] == '.'){
if(point || exp || !(i + 1 < strlen(string) && string[i + 1] >= '0' && string[i + 1] <= '9'))
// .后面必定为数字 或为最后一位(233. = 233.0)
return false;
point = true;
}
else if (string[i] == 'e' || string[i] == 'E'){
if (exp || i + 1 == strlen(string) || !(string[i + 1] >= '0' && string[i + 1] <= '9' || string[i + 1] == '+' || string[i + 1] == '-'))
// eE后面必定为数字或+-号
return false;
exp = true;
}
else if (string[i] >= '0' && string[i] <= '9'){
}else{
return false;
}
}
return true;
}
};