剑指offer 表示数值的字符串

时间限制: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...

以后见到这种题目,先把规则理清楚,再写代码。

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...

当然,牛油们还要更舒爽的写法,因为符合数值的字符串一定是+(-)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;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值