剑指Offer-20:表示数值的字符串

题目:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例子

例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

链接:

剑指Offer(第2版):P127

思路标签:

  • 字符串匹配

解答:

1. C++
  • 主要考察对问题分析的全面性;
  • 表示数值的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是整数(可以有正负号,也可以没有),而B是一个无符号整数。
  • 判断小数和整数部分用‘||’来判断:如:.123、233.、233.123这三个均为数值;(这里需要注意的是,使用‘||’要将scanUnsignedInteger()放在前面,因为如果numeric放在前面,numeric为真,scanUnsignedInteger()函数便不再执行,导致出错)
  • 判断小数和指数部分用‘&&’,因为e或者E前面都需要有数字。
  • 最后用字符串为空和前面的数字部分的‘&&’ 来防止指数出现小数或其他的情况。
class Solution {
public:
    bool isNumeric(char* string)
    {
        if (string == nullptr)
            return false;

        bool numeric = scanInteger(&string);

        if (*string == '.') {
            ++string;
            numeric = scanUnsignedInteger(&string) || numeric;
        }

        if (*string == 'e' || *string == 'E') {
            ++string;
            numeric = numeric && scanInteger(&string);
        }

        return numeric && *string == '\0';
    }

    bool scanInteger(char** string) {
        if (**string == '+' || **string == '-')
            ++(*string);

        return scanUnsignedInteger(string);
    }

    bool scanUnsignedInteger(char** string) {
        char* before = *string;
        while (**string != '\0' && **string >= '0' && **string <= '9')
            ++(*string);

        return *string > before;
    }
};
  • 因为在判断的过程中,涉及到了指针的变换,所以在函数传递的中需要使用指针的引用:&string,且子函数的参数为指针的指针:char** string。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值