• ACWING 031 表示数值的字符串


    地址 https://www.acwing.com/problem/content/description/29/

    leetcode 地址 https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
    
    例如,字符串"+100","5e2","-123","3.1416""-1E-16"都表示数值。
    
    但是"12e","1a3.14","1.2.3","+-5""12e+4.3"都不是。
    
    注意:
    
    小数可以没有整数部分,例如.123等于0.123;
    小数点后面可以没有数字,例如233.等于233.0;
    小数点前面和后面可以有数字,例如233.666;
    当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
    当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
    样例:
    输入: "0"
    
    输出: true

    算法1
    可以考虑使用状态机
    我这里使用各种符号标记来记录当前状态
    然后面对错误用例编程 hh

    C++ 代码

    class Solution {
    public:
    
    const int posnegFlag = 1;
    const int numFlag = 2;
    const int pointFlag = 4;
    const int eFlag = 8;
    
    bool isNumber(string s) {
        int l = 0; int r = s.size()-1;
    
        while (l < s.size() && s[l] == ' ') l++;
        while (r >= 0 && s[r] == ' ') r--;
    
        s = s.substr(l, r - l + 1);
        if (s.empty()) {return false;}
    
        int flag = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '+' || s[i]=='-') {
                if ( (flag & posnegFlag) != 0) return false; //已经设置过了 错误
                if ((flag & numFlag) != 0 && ((flag & eFlag) == 0)) return false;
                if ((flag & pointFlag) != 0 && ((flag & eFlag) == 0)) return false;
                flag |= posnegFlag;
            }
            else if (s[i] == 'e' || s[i] == 'E') {
                if ((flag & numFlag) == 0) return false; //前面没有数字 出现e 错误
                if ((flag & eFlag) != 0) return false; //前面已经标记e
                flag |= eFlag;
                flag &= ~(posnegFlag);
            }
            else if (s[i] == '.') {
                if ((flag & pointFlag) != 0) return false; //前面已经标记.
                if ((flag & eFlag) != 0) return false; //e后面无小数
                flag |= pointFlag;
            }
            else if (isdigit(s[i])) {
                flag |= numFlag;
            }
            else {
                return false;
            }
        }
    
        if (s.back() == 'e' || s.back() == 'E'   || s.back() == '+' || s.back() == '-' || (flag & numFlag)==0 ) return false;
    
        return true;
    }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    BPC (9) SAP BI & BPC 安装 : 一个外行眼里的千奇百怪 (1)
    ESB (2) POCSofewareAG
    BPC (7) BPC Netweaver 7 和 microsoft 7 版本的差异
    ESB (3) POCOralce ESB
    厘清了xorg里的一些概念
    Top命令和Kill命令
    ubuntu中文英文环境切换
    /etc/passwd 文件内容详细解释
    [分享] Linux下用Anjuta写个Hello World 的C++程序竟如此简单!
    /proc目录
  • 原文地址:https://www.cnblogs.com/itdef/p/13600564.html
Copyright © 2020-2023  润新知