Leetcode个人题解65

LEETCODE专题


65. Valid Number

题目要求:
这里写图片描述

这里题目要求我们判断一个字符串到底是不是一个数字。


问题:其实这道题归根结底只有一个亟待解决的问题,所以这里笔者偷个懒就不用数字列表了。这个最大的问题就是是不是一个数字的标准是什么。

分析:正如题目所说的一样,题目的例子给的是非常的含糊的,所以我们要做的事情就是丢进测试里去试一试,然后得到一些合法数字的标准。所以这道题考的就是耐心(-_-!)
通过惨痛的测试之后,笔者发现合法数字的标准可以分为以下几个方面来阐述:

  1. 数字,合法数字的首要标准就是要有数字。
  2. 小数点,合法数字可以含有小数点。
  3. 指数,合法数字可以含有指数。诸如9e11和7.5e18,但是血与泪的教训告诉我们,千万不要在指数e后面加含有小数点的数字。这里贼坑。(当然不信邪的可以试一下)。
  4. 符号,底数部分和指数部分的开头都可以含有1个符号’+’或’-‘。
  5. 空格,数字的两边可以含有空格。

知道了这几方面后,我们就可以写出代码了。


class Solution {
public:
    bool isDigit(char a) {
        return a >= '0' && a <= '9';
    }

    bool isExponent(char a) {
        return a == 'e' || a == 'E';
    }

    bool isSpace(char a) {
        return a == ' ' || a == '\t';
    }

    bool isDot(char a) {
        return a == '.';
    }

    bool isSign(char a) {
        return a == '+' || a == '-';
    }

    bool isNumber(string s) {
        int index = -1;

        bool first = true;
        bool end = false;

        // record if it has num, dot or exponent
        bool hasAnyNum = false;
        bool hasNum = false;
        bool hasDot = false;
        bool hasExponent = false;

        // record the last char
        bool num = false;
        bool exponent = false;
        bool space = false;
        bool dot = false;
        bool sign = false;
        while (++index < s.length()) {
            if (first) {
                if (isSpace(s[index])) {
                    space = true;
                    num = exponent = dot = sign = false;
                } else if (isDigit(s[index])) {
                    if (hasAnyNum) return false;
                    first = exponent = space = dot = sign = false;
                    hasNum = num = true;
                } else if (isExponent(s[index])) {
                    return false;
                } else if (isDot(s[index])) {
                    if (hasAnyNum) return false;
                    hasDot = dot = true;
                    first = exponent = space = num = sign = false;
                } else if (isSign(s[index])) {
                    if (hasAnyNum) return false;
                    sign = true;
                    first = num = exponent = space = dot = false;
                } else {
                    return false;
                }
            } else {
                if (isSpace(s[index])) {
                    if (num || dot) {
                        if (hasNum == false) return false;
                        hasNum = hasDot = hasExponent = num = exponent = dot = sign = false;
                        first = hasAnyNum = space = true;
                    } else {
                        return false;
                    }
                } else if (isDigit(s[index])) {
                    if (hasNum == false) hasNum = true;
                    num = true;
                    exponent = space = dot = sign = false;
                } else if (isExponent(s[index])) {
                    if (hasExponent) return false;
                    if (num || (dot && hasNum)) {
                        hasExponent = exponent = true;
                        num = space = dot = sign = false;
                    } else {
                        return false;
                    }
                } else if (isDot(s[index])) {
                    if (hasExponent || hasDot || dot || exponent) return false;
                    hasDot = dot = true;
                    num = exponent = space = sign = false;
                } else if (isSign(s[index])) {
                    if (exponent) {
                        sign = true;
                        num = exponent = space = dot = false;
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        }

        index--;
        if (isDigit(s[index]) || isDot(s[index])) {
            return hasNum;
        } else if (isSpace(s[index])) {
            return hasAnyNum;
        }
        return false;
    }
};

时间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/m0_37576233/article/details/78881576