写在前面

剑指offer:表示数值的字符串

题目要求

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

解法

class Solution {
public:
    bool isNumeric(char* string)
    {
        if(*string=='\0') return false;
        if(string[0]=='-'||string[0]=='+')
            return isNumber(string+1,0);
        return isNumber(string,0);
    }

    bool isNumber(char* string,int tag) {
        if(*string=='\0') return false;
        int n = strlen(string);

        for(int i=0;i<n;++i) {
            if(string[i]=='e'||string[i]=='E') {
                if(string[i+1]=='\0') return false;
                else if(string[i+1]=='+'||string[i+1]=='-')
                    return isnumber(string+i+2);
                else if(string[i+1]>='0'&&string[i+1]<='9')
                    return isnumber(string+i+1);
                else return false;
            }
            else if(string[i]=='.'&&!tag) {
                tag = 1;
                return isNumber(string+i+1,tag);
            }
            else if(string[i]=='+'||string[i]=='-')
                return false;
            else if(string[i]>='0'&&string[i]<='9')
                continue;
            else return false;
        }
        return true;
    }

    bool isnumber(char* str) {
        int n = strlen(str);
        if(!n) return false;
        for(int i=0;i<n;++i) {
            if(str[i]>='0'&&str[i]<='9')
                continue;
            else return false;
        }
        return true;
    }
};

分析:这道题目就是处理字符串的一个细节题目,包含多重的条件判断和嵌套情况。
首先,需要注意过滤掉最开始的+-号,我通过一个外层函数进行过滤。
其次,重点就在于处理到e/E以及处理到 . 的时候这两种特殊情况。
当处理到e/E的时候显然后面的字符串必然得是一个纯数字(过滤掉符号),只需要交给isnumber处理即可。
当处理到 . 的时候发现后面可以是一个纯数字也可以是一个不带 . 的科学计数法表示的数字,所以给定一个变量tag标识当前是不是处理过 . ,如果处理过了再次遇到就return false,如果第一次遇到 . 就直接递归判断后续的字符串。