剑指Offer(牛客版)--面试题20:表示数值的字符串

剑指Offer(牛客版)--面试题20:表示数值的字符串_第1张图片

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

分析:

剑指Offer(牛客版)--面试题20:表示数值的字符串_第2张图片

完整代码:

 

class Solution {
public:
    bool isNumeric(char* string)
    {
        //输入合法性检验
        if(string == nullptr)
            return false;
        //扫描整数部分
        bool numeric = scanInteger(&string);
        /************扫描小数部分**********/
        //如果扫描到 '.',这后面出现的小数部分
        if(*string == '.')
        {
            // 跳过符号 '.'
            ++string;
            //判断是否符合小数规则
            //小数点 '.' 前面可以有数字也可以没有数字
           numeric = scanunsignedInteger(&string) || numeric;
        }
        /**********扫描指数部分**********/
        //如果扫描到 'e' 或者 ’E',则后面出现的指数部分
        if(*string == 'e' || *string == 'E')
        {
            //跳过符号 'e' 或者 ’E'
            ++string;
            //判断是否符合指数部分规则
            //指数符号 'e' 或者 ‘E'前面和后面必须都有数字
            numeric = numeric && scanInteger(&string);
        }
        //遍历到结尾
       return numeric && *string == '\0';
    }
private:
     //扫描无符号数
    bool scanunsignedInteger(char** string)
    {
        //将当前的其实地址记录下来
        const char* before = *string;
        
        //当字符串没有到结尾时,且字符在 0~9之间
        while(**string !='\0' && **string >= '0' && **string <='9')
            //一直向下遍历
            ++(*string); 
        //若字符串中存在 0~9,则返回true;
        return *string > before;
    }
    
    //扫描有符号数
    bool scanInteger(char** string)
    {
        //如果以'+'或者’-‘开头
        if (**string == '+'|| **string == '-')
            //跳过当前的符号 '+' 或者’+‘
            ++(*string);
            //扫描无符号整数
        return scanunsignedInteger(string);
    }
};

 

 

你可能感兴趣的:(剑指Offer(牛客版))