剑指offer第53题——表示数值的字符串
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
这个题的难点在哪里?就是要我们对于数值类字符串有一个清晰的了解:
比如,+,-号出现的位置,.出现的位置,E出现的位置。
先看别人的代码:
1 class Solution { 2 public: 3 bool isNumeric(char* string) 4 { 5 if(string==NULL) 6 return false; 7 if(*string=='+'||*string=='-') 8 string++; 9 if(*string=='\0') 10 return false; 11 int dot=0,num=0,nume=0;//分别用来标记小数点、整数部分和e指数是否存在 12 while(*string!='\0'){ 13 if(*string>='0'&&*string<='9') 14 { 15 string++; 16 num=1; 17 } 18 else if(*string=='.'){ 19 if(dot>0||nume>0) 20 return false; 21 string++; 22 dot=1; 23 } 24 else if(*string=='e'||*string=='E') 25 { 26 if(num==0||nume>0) 27 return false; 28 string++; 29 nume++; 30 if(*string=='+'||*string=='-') 31 string++; 32 if(*string=='\0') 33 return false; 34 } 35 else 36 return false; 37 } 38 return true; 39 } 40 41 }; 42 //注意表示数值的字符串遵循的规则; 43 //在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位 44 //表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
分析其思路:
首先判断第一个字符是不是+,-号,之后依此对数字,小数点,字符e(E)进行判定。他的判顶规则是:
小数点最多只能有一个,且只能出现在字符e(E)的前面!
字符e也只能有一个,且其前面必须要有数字,最后补了一个e后面如果只有+,-没有数字,那么是错误的。
也就是全程让数字判断,小数点判断,和字母e判断各司其职。这样程序的思路是非常清晰的!!!
而我之前的想法是:
从第一个字母到最后一个字母,判断字符的前后位置关系是否正确。并且区分了一个字符,两个字符,三个字符,多个字符的情况,显然基于这种分类分思想是错误的!!!而基于特殊字符的位置信息,是正确的,我们只需要对特殊字符进行判定即可。
stay foolish,stay hungry