标签:sdi solution 特殊情况 设定 代码 exp one 符号 数位
题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路分析:
1. 第一种思路,是对于这种数值表示形式的特殊情况进行分析,这里一共包括了四种情况,需要设定三个数值来对于符号位的出现,小数点的出现以及e值的出现进行记录。分别使用布尔类型的三个变量:sign,dot,hasE。接下来分析四种特殊情况:
1)对于符号位‘+‘和‘-‘的出现的判断:只能出现在字符串的第一位或e/E的后面第一位。
2)对于e/E的出现判断:不能出现两次或出现在字符串的最后一位。
3)对于‘.‘的出现判断:不能出现两次,不能出现在字符串的最后一位,不能出现的e/E之后。
4)对于其他字符,只要不是0到9的数字就出错。
根据上述的特殊情况,对字符串进行一次遍历,当顺利完成遍历即为满足条件的字符串。
2. 第二种思路,是将整个字符串的形式进行了拆分,可以形式化表示为A[.[B]][e|EC],其中A,B,C表示数字,“|”表示或,[]表示可有可无的部分。
在数值之前可能有一个表示正负的‘+‘或者‘-‘。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学记数法表示,接下来是一个‘e‘或者‘E‘,以及紧跟着的一个整数(可以有正负号)表示指数。
这一部分对于字符串的遍历使用了指针,比较灵活,要注意理解p,*p,&p以及**p之间的区别。以及函数调用的过程指针的变化。
代码:
思路一:
1 class Solution { 2 public: 3 bool isNumeric(char* string) 4 { 5 if(string==nullptr) 6 return false; 7 bool sign=false, dot=false, hasE=false; 8 for(int i=0; i<strlen(string); i++) 9 { 10 if(string[i]==‘+‘ || string[i]==‘-‘) 11 { 12 if(!sign && i!=0 && string[i-1]!=‘e‘ && string[i-1]!=‘E‘) 13 return false; 14 else if(sign && string[i-1]!=‘e‘ && string[i-1]!=‘E‘) 15 return false; 16 sign = true; 17 } 18 else if(string[i]==‘e‘ || string[i]==‘E‘) 19 { 20 if(hasE || strlen(string)-1 == i) 21 return false; 22 hasE = true; 23 } 24 else if(string[i] == ‘.‘) 25 { 26 if(dot || strlen(string)-1==i || hasE) 27 return false; 28 dot = true; 29 } 30 else if(string[i]>‘9‘ || string[i]<‘0‘) 31 return false; 32 } 33 return true; 34 } 35 36 };
思路二:
1 class Solution { 2 public: 3 bool isNumeric(char* string) 4 { 5 if(*string==‘\0‘ || string==nullptr) 6 return false; 7 bool res = true; 8 if(*string == ‘+‘ || *string == ‘-‘) 9 string++; 10 isDigtal(&string); 11 if(*string!=‘\0‘) 12 { 13 if(*string == ‘.‘) 14 { 15 string++; 16 isDigtal(&string); 17 if(*string == ‘e‘ || *string == ‘E‘) 18 res = isExponential(&string); 19 } 20 else if(*string == ‘e‘ || *string == ‘E‘) 21 res = isExponential(&string); 22 else 23 res = false; 24 } 25 return res && *string==‘\0‘; 26 } 27 28 private: 29 void isDigtal(char** string) 30 { 31 while(**string !=‘\0‘ && **string>=‘0‘ && **string<=‘9‘) 32 { 33 (*string)++; 34 } 35 } 36 37 bool isExponential(char** string) 38 { 39 (*string)++; 40 if(**string==‘+‘ || **string==‘-‘) 41 (*string)++; 42 if(**string == ‘\0‘) 43 return false; 44 isDigtal(string); 45 return (**string == ‘\0‘) ? true : false; 46 } 47 48 };
标签:sdi solution 特殊情况 设定 代码 exp one 符号 数位
原文地址:https://www.cnblogs.com/LJ-LJ/p/11104902.html