zoukankan      html  css  js  c++  java
  • 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    关于一个标准的poi下载文件模板 可拿来来直接使用
    关于史上最简单的导出(导出excal)
    关于spring MVC的面试题
    关于响应式布局(pc端访问自适应 手机端访问自适应)
    密码生成器
    关于poi的导出(POI)
    关于MUI一个很实用的前端框架
    (转载)插画版Kubernetes指南(小孩子也能看懂的kubernetes教程)
    (转载)Python tips: 什么是*args和**kwargs?
    python编程中的if __name__ == 'main': 的作用和原理
  • 原文地址:https://www.cnblogs.com/itdef/p/13600564.html
Copyright © 2011-2022 走看看