【剑指Offer】面试题54:表示数值的字符串

来源:互联网 发布:php artisan 安装 编辑:程序博客网 时间:2024/06/07 09:36

一:题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

二:解题思路

把一个数字记为a×10^n的形式(1≤|a|<10,n为整数),这种记数法叫做科学记数法

三:代码实现

class Solution {public:    bool isNumeric(char* string)    {if(string==NULL || string=="") //如果字符串为空,则返回false            return false;        if(*string=='+' || *string =='-')//如果第一位为符号位,则继续遍历字符串            string++;        if(*string=='\0')   //如果只有一个符号位,返回false            return false;                    bool numeric=true;  //true:字符串是一个数值                scanDigits(string);        if(*string!='\0'){            //如果是个小数            if(*string=='.'){                string++;//越过小数点                scanDigits(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';   }//扫描字符串,直到不是数字为止void scanDigits(char* &string){        while(*string!='\0' && *string>='0'  && *string<='9')            string++;    }    //问题:没有检查E/e前面是否有数字    bool isExponential(char* &string){        if(*string!='e'  && *string!='E')            return false;        string++;        if(*string=='+' || *string=='-')//如果E/e后接的是+-号            string++;        if(*string=='\0')  //E/e后必须有数字或+—数字            return false;        scanDigits(string);        return (*string=='\0')?true:false;    }   };

存在的问题:没有判断E/e前是否有数字,以及数字是否合理

int main(){char* str = "0.0000";cout << str<<""<<isNumeric(str) << endl;char* str1 = "0.13e-10";cout << str1 << "" << isNumeric(str1) << endl;char* str2 = "-.0098";cout << str2 << "" << isNumeric(str2) << endl;char* str3 = "-e128";cout << str3 << "" << isNumeric(str3) << endl;char* str4 = "-e+";cout << str4 << "" << isNumeric(str4) << endl;char* str5 = "-0000e+0000";cout << str5 << "" << isNumeric(str5) << endl;system("pause");return 0;}

结果(1:true):

0.0000  1
0.13e-10        1
-.0098  1
-e128   1
-e+     0
-0000e+0000     1
请按任意键继续. . .

网友的结果

bool isNumeric(char* string){int len = strlen(string);int i = 0, dot = 0, nume = 0, num = 0;if (len == 0)return true;if (string[0] == '+' || string[0] == '-')i++;while (i<len){if (string[i] >= '0'&&string[i] <= '9'){i++;num = 1;}else if (string[i] == '.'){if (nume>0)return false;dot++;i++;}else if (string[i] == 'e' || string[i] == 'E'){if (nume>0 || num == 0)return false;nume++;i++;if (string[i] == '-' || string[i] == '+')i++;if (string[i] == '\0')return false;}elsereturn false;}if (dot>1 || nume>1)return false;return true;}
int main(){char* str = "0.0000";cout << str<<""<<isNumeric(str) << endl;char* str1 = "0.13e-10";cout << str1 << "" << isNumeric(str1) << endl;char* str2 = "-.0098";cout << str2 << "" << isNumeric(str2) << endl;char* str3 = "-e128";cout << str3 << "" << isNumeric(str3) << endl;char* str4 = "-e+";cout << str4 << "" << isNumeric(str4) << endl;char* str5 = "-0000e+0000";cout << str5 << "" << isNumeric(str5) << endl;system("pause");return 0;}

结果:
0.0000  1
0.13e-10        1
-.0098  1
-e128   0
-e+     0
-0000e+0000     1
请按任意键继续. . .


原创粉丝点击