表示数值的字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解题思路:
关键点是分析e存在的情况下前面数字的合法性和后面数字的合法性。记录e前面数字的值,记录e后面数字的值,同时在记录时判断合法性。
class Solution {
public:
bool isNumeric(char* string)
{
//e/E出现的位置
int e = -1;
//为了方便描述,下面所说e代表e/E
//e前面加减号的个数
int epreplus = 0;
//e后面加减号的个数
int ebehplus = 0;
//e前面逗号的个数
int epredot = 0;
//e后面逗号的个数
int ebehdot = 0;
//e前面整数部分的值 //e前面小数部分的值
double eprev1 = 0.0, eprev2 = 0.0;
//e前面逗号的位置
int epredotpos = -1;
//e前面的值
int ebehv = 0;
for(int i = 0 ; string[i] != '\0' ; i++){
if(string[i] == 'E' || string[i] == 'e'){
//出现两次e
if(e != -1){
// cout<<"c1"<<endl;
return false;
}
e = i;
//非法字符判断
}else if(string[i] != '.' && string[i] != '+' && string[i] != '-'
&& (!(string[i]>='0' && string[i] <= '9'))){
// cout<<"c2"<<endl;
return false;
}
//逗号次数判断
if(string[i] == '.'){
if(e == -1){
epredot ++;
//如果e前面逗号大于1个
if(epredot>1) {
// cout<<"c3"<<endl;
return false;
}
}else{
//e后面出现逗号
// cout<<"c4"<<endl;
return false;
}
}
//加减号次数判断
if(string[i] == '+' || string[i] == '-'){
if(e != -1){
epreplus++;
//e前面加减号出现次数大于1
if(epreplus>1){
// cout<<"c5"<<endl;
return false;
}
}else{
ebehplus++;
//e后面加减号出现次数大于1
if(ebehplus >1){
// cout<<"c6"<<endl;
return false;
}
}
}
if(string[i] != 'e' && string[i] != 'E'){
if(e == -1){
if(string[i] == '-' || string[i] == '+'){
//e前面的逗号必须是第一个字符
if(i != 0){
// cout<<"c7"<<endl;
return false;
}
}
if(string[i] == '.'){
epredotpos = i;
}else if(string[i] >= '0' && string[i] <= '9'){
if(epredotpos == -1){
//e前面整数部分
eprev1 = eprev1 * 10 + string[i]-'0';
}else{
//e前面小数部分
eprev2 = eprev2 + (string[i]-'0')/pow(10, i-epredotpos);
}
}
}else{
if(string[i] == '+' || string[i] == '-') {
//e后面正负号必须紧邻e
if(i-e != 1){
// cout<<"c8"<<endl;
return false;
}
}
if(string[i] >= '0' && string[i] <= '9'){
// cout<<"string[i]="<<string[i]<<endl;
//e后面的值
ebehv = ebehv*10 + string[i]-'0';
}
}
}
}
double eprev = eprev1+eprev2;
//cout<<"eprev="<< eprev<<endl;
//存在e且e前面的值为0或小于1
if(e != -1 && (eprev == 0 || eprev < 1)){
// cout<<"c10"<<endl;
return false;
}
//存在e且e后面的值等于0
if(e != -1 && ebehv == 0){
//cout<<"c11"<<endl;
return false;
}
return true;
}
};
学学学 练练练 刷刷刷

浙公网安备 33010602011771号