【模拟】B000_LCjz_表示数值的字符串(模拟+分类讨论)

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

方法一:模拟

...

class Solution {
public:
    bool isSign(char c) { return c=='+'||c=='-'; }
    bool is_e_or_E(char c) { return c=='e'||c=='E'; }
    bool isNumber(string s) {
        int n=s.size(), i=0;
        while (i<n && s[i]==' ') i++;
        if (s=="") return false;
        bool hasDig=false, hasSign=false, has_e_or_E=false, hasDot=false; 

        while (i<n) {
            char c=s[i];
            if (isdigit(c)) {
                hasDig=1;
            }else if (isSign(c)) {
                if (hasSign || hasDig || hasDot) return false;
                hasSign=1;
            }else if (is_e_or_E(c)) {
                if (has_e_or_E || !hasDig) return false;
                has_e_or_E=1, hasDig=hasSign=hasDot=0;  //e/E后面可以跟+/-,而此时+/-号前面如果出现了数字,则需要清除标记,否则会上面的if会误判+/-号前有数字
            }else if (c=='.'){
                if (hasDot || has_e_or_E) return false;
                hasDot=1;
            }else if (c==' ') {
                break;
            }else {
                return false;
            }
            i++;
        }
        while (i<n && s[i]==' ') i++;
        return hasDig && i==n;
    }
};  

复杂度分析

  • Time\(O(n)\)
  • Space\(O(1)\)
posted @ 2020-09-02 22:30  童年の波鞋  阅读(169)  评论(0编辑  收藏  举报