剑指offer 表示数值的字符串
2020-01-14 10:54
127 查看
时间限制:1秒 空间限制:32768K 热度指数:198826
本题知识点: 字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
题目链接:题目链接
这题没什么思维上的难点,主要是考查编写代码时的细节考虑,全是if/else搞定...但往往这样的题目坑点最多...考虑严谨,写代码的时候注意细节就好。
但是,这题真的就调了我好久,emmm。。。-.123竟然是true...
以后见到这种题目,先把规则理清楚,再写代码。
[code]class Solution { public: bool isNumeric(char* string) { //标记e、.、和+-是否出现过 bool flage = false, flagpoint = false, flagsymbol = false; for(int i=0;string[i]!='\0';i++){ bool ise = (string[i] == 'e' || string[i] == 'E');//判断当前是否为e bool ispree = (string[i-1] == 'e' || string[i-1] == 'E');判断前一字符是否为e bool isnum = (string[i] >= '0' && string[i] <= '9');//判断当前是否为数字 bool issymbol = (string[i] == '+' || string[i] == '-');//判断当前是否为正负号 bool ispoint = (string[i] == '.');//判断当前是否为小数点 //当前为正负号 if(issymbol){ //+-出现过,则+-只能出现在e后面 if(flagsymbol && !ispree) return false; //+-未出现,但是+-不为开头字符,则+-只能在e后面 if(!flagsymbol && i!=0 && !ispree ) return false; flagsymbol = true; } //e不能为开头字符 if(i == 0 && (!isnum && !issymbol && !ispoint)) return false; //当前为e if(ise){ //e没出现过,且不为最后一字符 if(!flage && string[i+1]!='\0'){ flage = true; } else return false; } //当前为. if(ispoint){ //.不能出现在e和.之后 if(!flagpoint && !flage){ flagpoint = true; } else return false; } //当前为其他字符 if(!ispoint && !ise && !isnum && !issymbol) return false; } return true; } }; //这个好像也有点bug,就是当输入"+"或者"-"时,会判断为true...
[code]当然,牛油们还要更舒爽的写法,因为符合数值的字符串一定是+(-)n.ne+(-)n,所以,可以按匹配模式写。 class Solution { public: int index = 0; bool isNumeric(char* string) { if (string[0] == '\0') return false; //匹配到+(-)n bool flag = isSymbol(string); //当前字符为. if(string[index] == '.'){ index ++ ; //匹配n,匹配结束后,当前匹配到+(-)n.n,其中.任意一边都可以为空,所以用或 flag = isNum(string) || flag; } //当前字符为e/E if(string[index] == 'e' || string[index] == 'E'){ index ++ ; 匹配+(-)n,匹配结束后,当前匹配到+(-)n.ne+(-)n,其中e的任意一边都不能为空,所以用与 flag = isSymbol(string) && flag; } //判断是否为数值 if(string[index] == '\0' && flag) return true; else return false; } bool isSymbol(char* string) { if(string[index] == '+' || string[index] == '-') index ++ ; return isNum(string); } bool isNum(char* string) { int findex = index; while(string[index] >= '0' && string[index] <= '9') index ++ ; return findex < index; } };
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 剑指offer-面试题54:表示数值的字符串
- 剑指offer第53题:表示数值的字符串
- 剑指offer-表示数值的字符串-java
- 【剑指offer——JAVA实现】表示数值的字符串(含思路解答示意图)
- 剑指offer——53.表示数值的字符串
- 【剑指Offer学习】【面试题54:表示数值的字符串】
- 剑指offer54 表示数值的字符串
- 剑指Offer-20:表示数值的字符串
- 剑指offer——面试题54:表示数值的字符串
- 剑指Offer——表示数值的字符串
- 2.1 剑指offer 表示数值的字符串
- 剑指offer--表示数值的字符串
- 【剑指offer】面试题20:表示数值的字符串
- 剑指offer - 表示数值的字符串
- 剑指offer:表示数值的字符串
- 剑指offer——表示数值的字符串(好题)(了解下库函数和正则)
- (C++)剑指offer-53:表示数值的字符串(字符串)
- 【剑指offer-解题系列(53)】表示数值的字符串
- 剑指Offer面试题54:表示数值的字符串
- 剑指offer-面试题54-表示数值的字符串