剑指OFFER 表示数值的字符串

剑指OFFER 表示数值的字符串

这道题主要考察的是对"如何表达数字"的理解,如何对这种表示建立一套可行的规则.

最初我的想法是从头到尾一个字符一个字符进行扫描,并且前面的扫描会对后面的扫描产生影响(出现无效字符就中断),如果扫描全程都没有被中断那么就判断该字符串是有效的.但是这种方法可读性比较差,会掺杂大量的if else 判断.

为了简化代码和捋清思路,我还是按照传统的方法,将复杂问题分解成小问题的方式来解决.

增设两个函数

一个函数判断是否是纯数字

一个函数判断是否是带小数点的纯数字

最后根据e/E的位置对字符串进行分解,然后用上述函数分别进行判断,最终得出结果.

class Solution {
public:
    //左闭右开
    //第一个字符一定是+或者-或者0~9
    //之后是只带一个小数点的纯数字
    bool is_number(char* str,int left,int right)
    {
        if(str[left]!='+'&&str[left]!='-'&&str[left]<'0'&&str[left]>'9')
            return false;
        int pos = left + 1;
        bool dot = false;
        while(str[pos]>='0'&&str[pos]<='9'&&pos<right||str[pos]=='.')
        {
            if(str[pos]=='.')
            {
                if(dot == true)return false;
                dot = true;
            }
            pos++;
        }
        return pos == right;
    }
    //左闭右开
    //第一个字符一定是+或者-或者0~9
    //之后都是纯数字
    bool is_number_without_dot(char* str,int left,int right)
    {
        if(str[left]!='+'&&str[left]!='-'&&str[left]<'0'&&str[left]>'9')
            return false;
        int pos = left + 1;
        while(str[pos]>='0'&&str[pos]<='9'&&pos<right)
        {
            pos++;
        }
        return pos == right;
    }
    
    bool isNumeric(char* str)
    {
        int pos = 0;//最终pos表示str的长度
        int pos_e = -1;//是否存在e/E
        while(str[pos] != '')
        {
            if(str[pos]=='e'||str[pos]=='E')
            {
                pos_e = pos;
            }
            pos++;
        }
        if(pos_e == -1)
        {
            //如果不是指数形式,那么只需要判断是否是带小数点的数字即可
            return is_number(str,0,pos);
        }else{
            //如果是指数形式
            //那么就分成两半,左边是带小数点的数字,右边是纯数字分别进行判断
            return is_number(str,0,pos_e) && is_number_without_dot(str,pos_e+1,pos);
        }
    }
};
原文地址:https://www.cnblogs.com/virgildevil/p/12179101.html