主页 > 软件开发  > 

剑指offer----C语言版----第十四天

剑指offer----C语言版----第十四天
表示数值的字符串 原题链接: 剑指 Offer 20. 表示数值的字符串 - 力扣(LeetCode) 1.1 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序)可以分成以下几个部分:         1.若干空格         2.一个 小数 或者 整数         3.(可选)一个 'e' 或 'E' ,后面跟着一个 整数         4.若干空格 小数(按顺序)可以分成以下几个部分:         1.(可选)一个符号字符('+' 或 '-')         2.下述格式之一:                   1.至少一位数字,后面跟着一个点 '.'                   2.至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字                   3.一个点 '.' ,后面跟着至少一位数字 整数(按顺序)可以分成以下几个部分:         1.(可选)一个符号字符('+' 或 '-')         2.至少一位数字 部分数值列举如下:        · ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"] 部分非数值列举如下:        · ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"] 1.2 思路分析

表示数值的字符串遵循模式 A[.[B]][e|EC]或者.B[e]EC],其中A 为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着'e或者E为数值的指数部分.在小数里可能没有数值的整数部分.例如,小数.123 等于0.123。因此 A 部分不是必需的。如果一个数没有整数部分,那么它的小数部分不

能为空。

上述A和 C都是可能以'+或者'-'开头的0~9 的数位串;B也是0~9的数位串,但前面不能有正负号。

以表示数值的字符串"123.45e+6"为例,“123”是它的整数部分A,“45”

是它的小数部分 B,“+6”是它的指数部分C。

判断一个字符串是否符合上述模式时,首先尽可能多地扫描0~9 的数位(有可能在起始处有'+'或者'-'),也就是前面模式中表示数值整数的A部分。如果遇到小数点.',则开始扫描表示数值小数部分的 B 部分。如果遇到'e'或者'E',则开始扫描表示数值指数的C 部分。

代码中有注释,说到底就是暴力枚举的感觉,剑指offer上跟leetcode上的题目略微有一点不同:剑指offer上表示数值的字符串前后没有空格。

bool isNumber(char* s){ if(s == NULL) { return false; } while(*s==' ') //跳过前面的空格 { s++; } if(*s=='+'||*s=='-') //判断正负号 { s++; if(*s=='+'||*s=='-') //连续的两个正负号 { return false; } } if(*s=='\0') //只有正负号的情况 { return false; } int dot = 0, e = 0, num = 0; //记录小数点,e,数字出现的次数 //遍历随后的字符串 while(*s!='\0') { if(*s>='0'&&*s<='9') { s++; num++; } else if(*s=='.') { if(dot > 0||e>0) { //在出现小数点时如果已经有小数点了,如: ..34 ; 或者e后面出现小数点,如:e3.2 return false; } s++; dot++; if(num==0 && !(*s>='0'&&*s<='9')) { return false; } } else if(*s=='e'||*s=='E') //判断e { if(num == 0 || e > 0) { //出现e却没有数字,如:e23;或者出现多个e,如:ee32 return false; } s++; e++; if(*s=='+'||*s=='-') //判断正负号 { s++; if(*s=='+'||*s=='-') //连续的两个正负号, e后面不能连续的两个正负号 { return false; } } if(*s=='\0'||*s==' ') //如果e后面就没了,return false { return false; } } else if(*s == ' ') { break; //遇到空格直接跳出循环 } else { return false; } } while(*s==' ') { s++; } if(*s=='\0') { //如果是末尾的空格返回true return true; } else { //如果是中间的空格返回false return false; } }

 

标签:

剑指offer----C语言版----第十四天由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“剑指offer----C语言版----第十四天

上一篇
OpenCV学习

下一篇
第二章:感知机