【剑指offer-解题系列(53)】表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

分析

各种情况分析:
1、小数
2、正负数
3、科学记数法

代码实现

  bool isSign(char  c) {
        if (c =='+' || c == '-') {
            return true;
        }
        return false;
    }


    bool isNum(char  c) {
        if (c <= 57 && c >= 48) {
            return true;
        }
        else {
            return false;
        }
    }


    bool isNormalNum(char* str, int start, int end, bool*sign = NULL) {
        if (start>end)
            return false;
        if (start == end)
            return isNum(str[end]);
        for (int ind = start; ind <= end; ind++) {
            if (ind == start && (str[start] == '+' || str[start] == '-'))
            {
                if(sign)
                    *sign = true;
                continue;
            }
            if (!isNum(str[ind]))
                return false;
        }
        return true;
    }


    bool isPoint(char* str, int start, int end) {
        int ind = 0;
        for (ind = start; ind <= end; ind++) {
            if (str[ind] == '.')
                break;
        }
        if (ind == end)return false;
        bool sign = false;
        return   (isNormalNum(str, start, ind - 1) ||
                  (ind == start) ||
                  (ind == start+1 && isSign(str[start]))
                 )
                  &&
            (isNormalNum(str, ind + 1, end, &sign) && sign == false);
    }


    bool isExp(char* str, int start, int end) {
        int ind = 0;
        for (ind = start; ind <= end; ind++) {
            if (str[ind] == 'E' || str[ind] == 'e')
                break;
        }
        if (ind == end)return false;
        return  (isNormalNum(str, start, ind - 1) ||
            isPoint(str, start, ind - 1)) &&
            isNormalNum(str, ind + 1, end);
    }




    bool isNumeric(char* str, int start, int end) {
        if (start == end)
            return isNum(str[end]);


        return isExp(str, start, end) ||
            isPoint(str, start, end) ||
            isNormalNum(str, start, end);
    }






    bool isNumeric(char* str) {


        int n = strlen(str);
        if (n == 0)
            return false;
        return  isNumeric(str, 0, n - 1);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值