您的位置:首页 > Web前端

剑指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;
}
};

 

  • 点赞
  • 收藏
  • 分享
  • 文章举报
idhua 发布了63 篇原创文章 · 获赞 0 · 访问量 254 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: