当前位置: 首页 > article >正文

LeetCode第65题 有效数字 结合设计模式:状态模式

思路:有限状态机,结合Java的设计模式:状态模式。


单纯用状态机会有大量的if-else,非常不好看,思路不清晰


用设计模式则非常清楚。但是设计模式是为了给人理解的,对机器而言也可能稍微影响性能;


状态模式的关键:Machine(这里的Machine类就是Solution)持有一个State接口对象,State是一个接口,ConcreteSate是State的子类,并且里面有状态的枚举;并且最关键是接口方法中都要接受一个Machine对象,这样才好改变State
这里只有一个accept方法,还不是很能体现状态模式的优势;如果再多来几个方法,用状态模式的优势就会更加明显。

注意:这样写出来的代码经测试用时2ms,不如直接面向过程的if-else大法。

因为设计模式本身就基本上是面向对象的,相当于为了人能更好理解,做了额外的封装,所以性能会稍微受点影响。

class Solution {
    State state = ConcreteState.INIT;

    public boolean isNumber(String s) {
        int n = s.length();
        for (int i = 0; i < s.length(); i++) {
            state.accept(s.charAt(i),this);
            if(state == ConcreteState.EXCEPTION){
                return false;
            }
        }
        if(state == ConcreteState.NUM2 || state == ConcreteState.NUM4
        || state == ConcreteState.INDEX3){
            return true;
        }else{
            return false;
        }

    }
}

interface State{
    void accept(char ch,Solution solution);
}

enum ConcreteState implements State {
    /**
     用状态机来做
     0-初始状态:可以接正负号或数字,接到一个正负号或数字或小数点
     如果接收到正负号,转为数字模式1;如果接收到数字,转为数字模式2;如果接收到小数点,转为数字模式3
     1-数字模式1:可以接受数字、小数点
     如果接收到数字,转为数字模式2;如果接收到小数点,转为数字模式3
     2-数字模式2:可以接受数字、小数点、或e/E、或结束
     如果接收到数字,不变;如果接收到小数点,转为模式4,如果接收到e/E,转为指数模式;也可在此处结束
     3-数字模式3:必须接受数字,接收数字后转为数字模式4
     4-数字模式4:可以接受数字、e/E、或结束
     如果接收数字,不变;如果接收e/E,转为指数模式;也可在此结束
     5-指数模式:能接受正负号或数字。
     如果接收正负号,转为指数模式2
     如果接收数字,转为指数模式3
     6-指数模式2:只能接受数字
     接受后转为指数模式3
     7-指数模式3:能接收数字、或在此结束
     8-异常状态
     */

    INIT{
        @Override
        public void accept(char ch,Solution solution) {
            if (ch == '+' || ch == '-' ){
                solution.state = NUM1;
            }else if(ch >= '0' && ch <= '9'){
                solution.state = NUM2;
            }else if(ch == '.'){
                solution.state = NUM3;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    NUM1{
        @Override
        public void accept(char ch, Solution solution) {
            if (ch >= '0' && ch <= '9'){
                solution.state = NUM2;
            }else if(ch == '.'){
                solution.state = NUM3;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    NUM2{
        @Override
        public void accept(char ch, Solution solution) {
            if (ch >= '0' && ch <= '9'){
                solution.state = NUM2;
            }else if(ch == '.'){
                solution.state = NUM4;
            }else if(ch == 'e' || ch == 'E'){
                solution.state = INDEX;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    NUM3{
        @Override
        public void accept(char ch, Solution solution) {
            if(ch >= '0' && ch <= '9'){
                solution.state = NUM4;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    NUM4{
        @Override
        public void accept(char ch, Solution solution) {
            if(ch >= '0' && ch <= '9'){
                solution.state = NUM4;
            }else if(ch == 'e' || ch == 'E'){
                solution.state = INDEX;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    INDEX{
        @Override
        public void accept(char ch, Solution solution) {
            if(ch >= '0' && ch <= '9'){
                solution.state = INDEX3;
            }else if(ch == '+' || ch == '-'){
                solution.state = INDEX2;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    INDEX2{
        @Override
        public void accept(char ch, Solution solution) {
            if(ch >= '0' && ch <= '9'){
                solution.state = INDEX3;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    INDEX3{
        @Override
        public void accept(char ch, Solution solution) {
            if(ch >= '0' && ch <= '9'){
                solution.state = INDEX3;
            }else{
                solution.state = EXCEPTION;
            }
        }
    },
    EXCEPTION{
        @Override
        public void accept(char ch,Solution solution) {

        }
    }
}


http://www.kler.cn/news/284906.html

相关文章:

  • Linux下C++编程使用动态链接库
  • Openldap可视化工具PhpLdapAdmin服务配置
  • TMPDIR在pip|pip3 install时的作用以及tmp只有noexec权限的解决方法
  • 问题记录之Qt Creator下qDebug中文乱码
  • SparkSQL缓存的用法
  • IM社交-前言
  • 负载均衡的分类有哪些?
  • 路由策略工具
  • 51单片机——模块化编程
  • Kafka分布式集群部署实战:跨越理论,直击生产环境部署难题与解决方案,性能调优、监控与管理策略大揭秘,轻松上手分布式消息中间件
  • 【SQL基础】【leetcode】SQL50题
  • 『功能项目』技能释放【08】
  • Java设计模式【解释器模式】-行为型
  • 【QT线程学习】
  • PowerDesigner16.5 从mysql5.7逆向工程
  • ClickHouse的安装教程
  • 计算机网络概述(Internet结构和ISP)
  • matlab仿真 信道编码和交织(下)
  • 【docker】docker学习笔记
  • Datawhale AI夏令营 第五期 CV方向 Task3笔记
  • GD - GD32350R_EVAL - PWM实验和验证1
  • React原理之Diff算法
  • ESP32-S3 IDF框架 控制 WS2812 灯条:实现多种灯效
  • 【通过h5作为中转页跳转到微信小程序】
  • 【Linux】06.Linux 下的编译器——gcc/g++
  • 【C++ 第十八章】C++11 新增语法(2)
  • vue3+el-tale封装(编辑、删除、查看详情按钮一起封装)
  • 【HarmonyOS 4.0】@ohos.router 页面路由
  • ★ 算法OJ题 ★ 力扣11 - 盛水最多的容器
  • sqlite3 数据插入效率