剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是
1 题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
2 思路和方法
(1)表示数值的字符串遵循模式 A[.[B]][e|EC] 或者.[B][e|EC] ,其中A为数值的整数部分,B为小数点后数值的小数部分,C紧跟着’e’和’E’为数值的指数部分。注:小数点前可以有数字也可以没有数字。
将整个过程分为三个步骤
1)先扫描数值的整数部分;首先取首位的符号,扫描整数部分A
2)如果遇到小数点’.’,开始扫描小数部分B
3)如果遇到’e’和’E’,开始扫描直属部分C
(2)注意表示数值的字符串遵循的规则;在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位,表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
3 C++核心代码
(1)
1 class Solution { 2 public: 3 int index=0; 4 bool isNumeric(char* string) 5 { 6 if(!string) return false; 7 //数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是 8 //整数(可以有正负号,也可以没有),而B是一个无符号整数 9 bool flag=scanInteger(string); 10 if(index<strlen(string) && string[index]=='.'){ 11 index++; 12 flag=scanUnsignedInteger(string) || flag;//这里用||的原因,.前面后面可以不跟着数字。注:这里flag一定要放在||后面!! 13 } 14 if(index<strlen(string) && (string[index]=='e' || string[index]=='E')){ 15 index++; 16 flag=flag && scanInteger(string);//这里用&&的原因,e|E前面后面都必须要有数字 17 } 18 return flag && index==strlen(string);//注:index==strlen(string)一定要加!!反例1a123 19 } 20 bool scanInteger(char* string){//扫描+或-或空起始的0-9的数位,对应A,C 21 if(index<strlen(string) && (string[index]=='+' || string[index]=='-')) 22 index++; 23 return scanUnsignedInteger(string);//true表示存在A或C 24 } 25 bool scanUnsignedInteger(char* string){//扫描0-9的数位,对应B 26 int start=index; 27 while(index<strlen(string) && string[index]>='0' && string[index]<='9') 28 index++; 29 return index>start;//true表示存在B 30 } 31 32 };
(2)
1 //注意表示数值的字符串遵循的规则; 2 //在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位 3 //表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。 4 class Solution { 5 public: 6 bool isNumeric(char* string) 7 { 8 if(string==NULL or *string=='\0') 9 return false; 10 if(*string=='+'||*string=='-') 11 string++; 12 int dot=0,num=0,nume=0; 13 while(*string != '\0'){ 14 if(*string>='0' && *string<='9'){ 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 if(nume>0||num==0) 26 return false; 27 string++; 28 nume++; 29 if(*string=='+' || *string=='-') 30 string++; 31 if(*string=='\0') 32 return false; 33 } 34 else 35 return false; 36 } 37 return true; 38 } 39 };
参考资料
https://blog.csdn.net/fuqiuai/article/details/88198099
https://blog.csdn.net/u012477435/article/details/83351659#_873