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

设计模式(行为型)解释器模式

定义

        给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这意味着我们能够针对特定领域的问题,构建一套专属的语言体系,并通过解释器对使用该语言描述的问题进行解析和处理。例如,在数学计算领域,我们可以定义一套包含数字、运算符的简单语言,然后利用解释器模式来实现对诸如 “3 + 5 * 2” 这样的数学表达式的计算。

类图

核心角色 

  • 抽象表达式(Abstract Expression)角色:它如同整个解释器模式的基石,定义了解释器的通用接口。在这个接口中,最重要的是 interpret() 方法,此方法约定了具体解释器实现解释操作的规范。所有具体的表达式类,无论是终结符表达式还是非终结符表达式,都继承自这个抽象类,并实现其 interpret() 方法,从而保证了整个解释器体系的一致性和规范性。​

  • 终结符表达式(Terminal Expression)角色:作为抽象表达式的子类,终结符表达式主要负责处理文法中的终结符相关操作。在实际的语言文法中,终结符是那些不能再进一步分解的基本元素。以简单的数学表达式为例,数字就是终结符。每一个终结符在解释器模式中都有一个对应的具体终结表达式类。比如,对于数字 “5”,我们可能会有一个 NumberTerminalExpression 类来处理,它实现了 interpret() 方法,用于在解释过程中对数字进行相应的处理,可能是返回数字本身的值,以便后续在表达式计算中使用。​

  • 非终结符表达式(Nonterminal Expression)角色:同样继承自抽象表达式,非终结符表达式的职责是实现与文法中的非终结符相关的操作。非终结符通常代表文法中的运算符、连接词或其他具有语法结构意义的元素。继续以数学表达式为例,加法运算符 “+”、乘法运算符 “*” 等都是非终结符。对于每一条文法规则,都需要一个具体的非终结符表达式类来实现。例如,对于加法运算规则,我们可能会有一个 AdditionNonterminalExpression 类,它的 interpret() 方法会处理两个子表达式相加的逻辑,通过调用子表达式的 interpret() 方法获取值,并执行加法操作,最终返回计算结果。​

  • 环境(Context)角色:环境角色可以看作是整个解释器系统中的数据共享中心。它通常包含各个解释器在执行过程中需要的数据,或者提供一些公共的功能。这些数据可能是全局变量、配置信息等。在解释过程中,不同的解释器可以从环境中获取所需的值,从而保证解释过程的连贯性和准确性。例如,在一个涉及变量计算的表达式解释中,环境角色可以存储变量的名称和对应的值,当解释器遇到变量时,能够从环境中查询到该变量的值,进而进行后续的计算。​

  • 客户端(Client)角色:客户端在解释器模式中扮演着发起者和协调者的角色。其主要任务是将需要分析的句子或表达式,通过一系列操作转换成使用解释器对象描述的抽象语法树。抽象语法树以一种结构化的方式展示了表达式的语法结构,便于解释器进行后续的解释执行。完成抽象语法树的构建后,客户端会调用解释器的解释方法,启动解释过程。在某些情况下,客户端也可以通过环境角色间接访问解释器的解释方法,这种间接访问的方式在一些复杂的系统架构中,有助于更好地管理和控制解释器的执行流程。

优缺点

(一)优点​

  • 拓展性好:解释器模式的一个显著优势在于其出色的扩展性。由于该模式使用类来表示语言的文法规则,这就为拓展和修改文法提供了极大的便利。通过继承机制,开发者可以轻松地创建新的表达式类来实现新的文法规则,或者修改现有表达式类的行为以适应文法的变化。例如,在一个简单的文本查询语言中,如果最初只支持按关键词搜索,后续需要增加按日期范围搜索的功能,我们可以通过创建一个新的非终结符表达式类来实现日期范围搜索的文法规则,而无需对整个解释器系统进行大规模的重构。​

  • 容易实现:语法树中的每个表达式节点类具有相似的结构和功能,这使得实现文法相对容易。开发者只需要按照统一的模式,分别为终结符和非终结符创建相应的表达式类,并实现其解释方法即可。这种一致性降低了开发的难度,提高了开发效率。例如,在实现一个简单的算术表达式解释器时,无论是处理数字的终结符表达式类,还是处理加、减、乘、除运算的非终结符表达式类,它们的结构和实现方式都遵循相似的模式,开发者可以快速上手并完成实现。​

(二)缺点​

  • 执行效率低:解释器模式在执行过程中通常依赖大量的循环和递归调用。当需要解释的句子较为复杂时,这种调用方式会导致性能问题,运行速度明显下降。以一个多层嵌套的复杂数学表达式为例,解释器在计算过程中需要不断地递归调用各个子表达式的解释方法,这会消耗大量的系统资源和时间。同时,由于递归调用的复杂性,代码的调试过程也变得异常繁琐,开发者难以快速定位和解决问题。​

  • 类膨胀问题:在解释器模式中,每条文法规则至少需要定义一个类。随着文法规则数量的增加,类的个数会急剧膨胀。例如,在一个复杂的编程语言解释器中,可能存在众多的语法规则,包括各种数据类型、运算符、控制结构等,这将导致大量的表达式类被创建。类的数量过多不仅会使系统的代码量大幅增加,还会增加系统的复杂性,使得代码的管理和维护变得困难重重。​

  • 适用场景有限:在软件开发的实际场景中,真正需要定义语言文法的情况并不常见。大多数业务场景可以通过常规的编程方式来解决,无需构建复杂的解释器系统。这就使得解释器模式的应用范围受到一定限制,不像其他一些通用性较强的设计模式那样广泛应用于各种项目中。

适用场景 

  • 简单文法且对效率要求不高的场景:当语言的文法较为简单,并且执行效率不是首要考虑因素时,解释器模式是一个不错的选择。例如,在一些小型的配置文件解析场景中,配置语言的文法通常比较简单,且对解析速度的要求相对较低。此时,使用解释器模式可以方便地定义和解析配置语言,通过构建抽象语法树并进行解释执行,实现对配置信息的读取和处理。​

  • 问题重复出现且能用简单语言表达的场景:如果某个问题频繁出现,并且可以用一种简单的语言来描述,那么解释器模式能够发挥其优势。通过定义相应的文法和解释器,开发者可以快速处理这类重复问题。比如,在一个日志分析系统中,经常需要根据一些固定的规则对日志进行过滤和分析,我们可以定义一套简单的日志查询语言,利用解释器模式实现对日志的快速筛选和分析,提高系统的处理效率。​

  • 需要解释执行且句子可表示为抽象语法树的场景:当一个语言需要被解释执行,并且其中的句子能够表示为抽象语法树时,解释器模式就可以派上用场。典型的例子如 XML 文档解释,XML 文档具有明确的层次结构,可以很自然地转化为抽象语法树。通过解释器模式,我们可以定义 XML 语言的文法规则,并构建解释器来解析 XML 文档,提取其中的信息,实现对 XML 数据的处理和应用。

使用案例

  • Expression4J:Expression4J 是一个用于解析和计算数学表达式的 Java 库,它充分运用了解释器模式。通过定义各种表达式节点类,如数字节点、运算符节点等,实现了对数学表达式的解释执行。开发者可以使用 Expression4J 方便地处理各种数学表达式,无论是简单的四则运算,还是复杂的函数计算,都能通过该库轻松实现。​

  • Jep(Java 表达式分析器):Jep 也是一个基于解释器模式的 Java 库,它具有强大的表达式解析和计算能力,支持变量、函数、数组等复杂元素。在很多需要处理表达式的 Java 项目中,Jep 都发挥了重要作用。例如,在一些科学计算、数据处理等领域的项目中,Jep 可以帮助开发者快速解析和计算用户输入的复杂表达式,提供准确的计算结果。​

  • Spring-expression:在 Spring 框架中,Spring-expression 用于支持查询和操作运行时对象导航图。它定义了一套表达式语言,并通过解释器模式实现对表达式的解析和执行。在 Spring 的应用场景中,开发者可以使用 Spring-expression 来动态地获取和设置对象的属性、调用对象的方法等。例如,在 SpEL(Spring Expression Language)中,通过不同的表达式节点类来处理字面量、变量引用、对象属性和方法调用等操作,为 Spring 框架的灵活性和扩展性提供了有力支持。​

  • 正则表达式 Pattern 类:虽然正则表达式的实现不完全等同于解释器模式,但在一定程度上借鉴了解释器模式的思想。Pattern 类用于定义正则表达式的文法,通过对输入字符串与正则表达式的匹配过程,可以看作是一种解释执行的过程。在处理文本匹配、字符串查找和替换等问题时,正则表达式利用类似解释器模式的机制,将正则表达式字符串解析为内部的状态机或语法树结构,然后对输入字符串进行逐个字符的匹配检查,从而实现强大的文本处理功能。

总结

        解释器模式作为一种独特的设计模式,在特定的领域和场景中展现出了其独特的价值。尽管它存在一些局限性,但在合适的情况下,能够为开发者提供高效、灵活的解决方案,帮助解决那些需要定义和解释特定语言的复杂问题。通过深入理解解释器模式的原理、优缺点和适用场景,开发者可以在软件开发过程中更加明智地选择和应用该模式,提升软件系统的质量和可扩展性。

相关文章:

设计模式(行为型)解释器模式

定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这意味着我们能够针对特定领域的问题,构建一套专属的语言体系,并通过解释器对使用该语言描述的问题进行解析和处…...

海外独立站VUE3加载优化

主要有几个明显问题 1. 请求数量太多(139 requests) 网页请求了*大量 JS 文件*(都是 index-xxxx.js),而且每个文件都比较小。 每次建立请求都有 TCP 连接开销(特别是 HTTP/1.1),导…...

关于windows API 的键鼠可控可测

相关函数解释 GetAsyncKeyState 是 Windows API 中的一个函数,用于判断某个虚拟键是否被按下。GetAsyncKeyState(VK_ESCAPE) 专门用于检测 Esc 键的状态。下面为你详细介绍其用法: 函数原型 cpp SHORT GetAsyncKeyState( int vKey ); 参数 vKey&a…...

普发ASM392EUV检漏仪维修说明手测内容可目录

普发ASM392EUV检漏仪维修说明手测内容可目录...

Python pip下载包及依赖到指定文件夹

要使用pip下载包及其所有依赖到指定文件夹,请按照以下步骤操作: 步骤说明 使用pip download命令:该命令用于下载包及其依赖而不安装。指定目标目录:通过-d或--dest参数设置下载路径。确保包含依赖:默认情况下会下载依…...

DIFY 又跟新了,来到 1.3.0 版本,看正文

欢迎来到 1.3.0 版本!添加了各种巧妙的功能、修复了错误,并带来了一些新功能: 一、核心亮点: 结构化输出 1、LLM 节点新增JSON Schema编辑器,确保大语言模型能够返回符合预设格式的JSON数据。这一功能有助于提升数据…...

凸包问题 Graham 扫描算法 MATLAB

算法要解决的问题 Graham 扫描算法要解决的问题是在给定一组二维平面上的点集时,找出能够完全包含这些点的最小凸多边形,这个最小凸多边形就是这些点的凸包。在很多实际场景中,我们可能只关注一个点集的最外层边界,而凸包算法就可…...

es+kibana---集群部署

其实一般es要跑3个节点的,这样才能做高可用,处理并发大,但是我这里只是一个pod mkdir -p /stroe/data/es es搭建: #【拉取镜像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【导入镜像】 docker load -i es.…...

定时器的源码介绍与简单实现——多线程编程简单案例[多线程编程篇(5)]

目录 前言 什么是定时器 JAVA标准库中的定时器 而关于sched方法,请看源码: 为什么我们能知道"notify() 唤醒后台线程 TimerThread"? TimerThread 关键逻辑 第一步:加锁 queue,看有没有任务 第二步:取出最近要执行的任务 …...

SQL常用数据清洗语句

数据清洗:发现并纠正数据文件里的数据错误和不一致性,让数据达到分析要求的过程。 运用 SQL 进行数据清洗时,可借助多种语句和函数来处理数据中的缺失值、重复值、异常值以及格式错误等问题。 1. 处理缺失值 数据中某些变量的值为空的情况&…...

《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》

在电商数据处理领域,高效获取并处理海量商品数据是企业实现精准运营、市场分析的重要基础。Go 语言凭借其出色的并发性能,成为开发高并发爬虫的理想选择。本文将介绍如何使用 Go 语言进行淘宝商品 API 实时采集,并构建 ETL(Extrac…...

大模型(LLMs)加速篇

当前优化模型最主要技术手段有哪些? 算法层面:蒸馏、量化软件层面:计算图优化、模型编译硬件层面:FP8(NVIDIA H系列GPU开始支持FP8,兼有fp16的稳定性和int8的速度) 推理加速框架有哪一些&#…...

Linux0.11引导启动程序:简略过程

引言 目标:是重写boot文件夹下面的引导文件,加入一些个人信息。语法:由于使用两个语法风格的汇编需要两个汇编器,有些麻烦,直接全都用GNU的 as(gas)进行编译。使用AT&T 语法的汇编语言程序。接下来先拜读同济大学赵…...

【JAVAFX】controller中反射调用@FXML的点击事件失败

场景 当前有一个controller中定义的事件如 FXMLvoid openZhengjieWindow(ActionEvent event) {System.out.println("zhengjie");}通过反射去调用 public void callMethodByString(String methodSuffix) {try {Method method this.getClass().getMethod("open&…...

人工智能数学基础(二):初等数学

在人工智能领域,初等数学知识是构建复杂模型的基石。本文将从函数、数列、排列组合与二项式定理、集合等方面进行讲解,并结合 Python 编程实现相关案例,帮助大家更好地理解和应用这些数学知识。资源绑定附上完整代码供读者参考学习&#xff0…...

opendds的配置

配置的使用 文档中说明有4种使用配置的方式: 环境变量 命令行参数(将覆盖环境变量中的配置) 配置文件(不会覆盖环境变量或命令行参数中的配置) 用户调用的 API(将覆盖现有配置) 这里对开发…...

mac 基于Docker安装minio

在 macOS 上基于 Docker 安装 MinIO 是一个高效且灵活的方案,尤其适合本地开发或测试环境。以下是详细的安装与配置步骤,结合了最佳实践和常见问题的解决方案: 一、安装 Docker Desktop 下载安装包 访问 Docker 官网,下载适用于 …...

Docker网络架构深度解析与技术实践

目录 第一章 Docker网络架构核心原理 1.1 容器网络模型(CNM)体系 1.2 网络命名空间隔离机制 1.3 虚拟网络设备对(veth) 1.4 网桥驱动模型 第二章 Docker网络模式深度剖析 2.1 Bridge模式(默认模式) …...

如何通过Google Chrome增强网页内容的安全性

在现代互联网环境中,网页安全问题时常困扰着用户。谷歌浏览器作为全球使用最广泛的浏览器之一,提供了多种方式帮助用户增强网页的安全性。以下是一些简单有效的方法,可以帮助用户提高浏览器的安全防护能力。 首先,谷歌浏览器自带了…...

劳动节ppt免费下载,劳动节ppt模板,劳动节课件

劳动节ppt免费下载,劳动节ppt模板,劳动节素材,学生,幼儿园课件:劳动节ppt_模板素材_PPT模板_ppt素材_免抠图片_AiPPTer...

应用在通信网络设备的爱普生晶振SG2016CBN

在数字化浪潮席卷全球的当下,通信网络已成为信息时代的核心基础设施,从 5G 基站的快速部署到数据中心的高效运转,从光纤网络的稳定传输到无线通信的流畅连接,每一个环节都对时钟信号的稳定性和精准性有着极高要求。一个高质量的时…...

STM32 RTC配置

一、什么是RTC? RTC,即实时时钟,是一种能持续运行并保持当前时间信息的电子装置。它常用于在设备断电的情况下依然能保持准确的年、月、日、时、分、秒信息。 与CPU核心时钟不同,RTC通常采用独立的低频晶振(如32.768…...

图像保边滤波之BEEPS滤波算法

目录 1 简介 2 算法原理 3 代码实现 4 演示Demo 4.1 开发环境 4.2 功能介绍 4.3 下载地址 参考 1 简介 BEEPS(Bias Elimination in Edge-Preserving Smoothing) 是一种基于偏微分方程(PDE)的边缘保留平滑滤波算法。它能够…...

使用OpenCV和dlib库进行人脸关键点定位

文章目录 引言一、环境准备二、代码实现解析1. 导入必要的库2. 加载图像和人脸检测器3. 加载关键点预测模型4. 检测并绘制关键点5. 显示结果 三、68个关键点的含义四、常见问题解决五、总结 引言 人脸关键点定位是计算机视觉中的一项基础任务,它在人脸识别、表情分…...

Transformer数学推导——Q27 证明时序注意力(Temporal Attention)在视频模型中的帧间依赖建模

该问题归类到Transformer架构问题集——注意力机制——跨模态与多模态。请参考LLM数学推导——Transformer架构问题集。 在视频理解任务中,捕捉帧与帧之间的时间依赖关系(如动作的连贯性、物体的运动轨迹)是核心挑战。时序注意力&#xff08…...

相机-IMU联合标定:相机标定

文章目录 📚简介💡标定方法🚀标定工具kalibr🚀标定数据录制🚀相机标定📚简介 在 VINS(Visual-Inertial Navigation System,视觉惯性导航系统) 中,相机标定 是确保视觉数据准确性和系统鲁棒性的关键步骤,其核心作用可总结为以下方面: 消除镜头畸变,提升特征…...

sevlet API

sevlet API API就是一组类和方法 HttpServlet 这是写servlet代码用到的核心的类,通过继承这个类,并重写其中的方法,让Tomcat去调用这里的逻辑. init:webapp被加载的时候,执行 destroy:webapp被销毁的时候(Tomcat结束)执行,进行一些收尾工作.但是这个方法不保证能够调用到!!…...

python程序设习题答案

第一章 1.在下列领域中,使用 Python 不可能实现的是( C ) A . Web 应用开发 B .科学计算 C .操作系统管理 D .游戏开发 2.Python程序文件的扩展名是( D )。 A.python B.pyt C.pt D.py 3&…...

[计算机科学#4]:二进制如何塑造数字世界(0和1的力量)

【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要: 二进制是计算机世界的基石,数学是世界的…...

一种在使用Kaggle并遇上会话中断时强行保存数据的方法

问题:kaggle会话结束后,无法保存训练模型时记录的excel文件 解决方法:使用kaggle时,使用下面脚本可将保存到训练数据excel转为链接形式,从而在kaggle会话终止时也可以下载到该excel文件 import base64 import pandas …...

【人工智能agent】--dify搭建智能体和工作流

【人工智能agent】--docker本地部署dify教程-CSDN博客 上期讲到如何部署dify,然后进入页面: docker服务: 目录 1.基础设置 2.创建聊天助手 3.创建知识库应用 4.创建智能体 5.创建工作流 5.1.文档总结规划 5.2.爬取网页新闻 1.基础设…...

[4282]PHP跨境电商源码-多语言商城源码/支持代理+商家入驻+分销+等等众多功能/带详细安装

源码获取:[4282]PHP跨境电商源码-多语言商城源码/支持代理商家入驻分销等等众多功能/带详细安装云溪资源网_源码下载,小程序源码下载,网站源码下载,游戏源码下载云溪资源网_源码下载,小程序源码下载,网站源码下载,游戏源码下载...

MongoDB的增删改查操作

1.文档创建 首先要插入数据前&#xff0c;要先创建数据库&#xff0c;创建完之后建立集合&#xff0c;然后才能进行增删改查的步骤 切换&#xff08;新建&#xff09;数据库&#xff1a; use <db> db是指要创建数据库的名称 新建集合&#xff1a; db.createCollection(…...

TimDbg

晚上随意浏览&#xff0c;发现一个有趣的网站&#xff1a; TimDbg 调试器谎言&#xff1a;堆栈损坏 // TimDbg 2022.11的一篇很有趣&#xff0c;讲如何培养裸眼反汇编的能力&#xff0c;即培训心智模型&#xff0c;模式识别能力。 识别内存中的模式 // TimDbg 我是用edge浏…...

MySQL 表的约束(二)

文章目录 自增长唯一键外键 自增长 auto_increment&#xff1a;当对应的字段&#xff0c;不给值&#xff0c;会自动的被系统触发&#xff0c;系统会从当前字段中已经有的最大值1操作&#xff0c;得到一个新的不同的值。通常和主键搭配使用&#xff0c;作为逻辑主键。 create …...

大数据应用开发和项目实战

Matplotlib的介绍 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Matplotlib 可以用来绘制各种静态&#xff0c;动态&#xff0c;交互式的图表。比如说散点图、柱状图等等。 Matplotlib Pyplot plot(…...

OpenLayers矢量数据可视化高级技巧(进阶二)

1. 高级样式技术 矢量数据的样式直接影响可视化效果的表达能力和美观度。OpenLayers提供了丰富的样式API&#xff0c;通过组合和创新&#xff0c;可以实现各种复杂的视觉效果。 1.1 动态样式 // 根据属性值动态设置样式 const vectorLayer new ol.layer.Vector({source: ne…...

实用的java技术架构组件汇总

1.后端数据校验 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>校验注解 jakarta.validation-api 规范提供如下&#xff1a; size hibern…...

Rmarkdown输出为pdf的方法与问题解决

R 是一种在数据分析与统计计算领域广泛使用的编程语言。其关键优势之一是能够生成高质量的报告和文档&#xff0c;这些报告和文档可以使用 RMarkdown 轻松定制和更新。在本文中&#xff0c;我们将探讨使用 R 从 RMarkdown 文件生成.pdf 文件 1.生成方法 新建Rmarkdown&#xf…...

【超详细讲解】什么是序列化和反序列化?

目录 一、什么是序列化&#xff08;Serialization&#xff09;&#xff1f; 举个直观的例子 二、什么是反序列化&#xff08;Deserialization&#xff09;&#xff1f; 三、为什么需要序列化&#xff1f; 四、常见的序列化格式对比 五、序列化底层是怎么做的&#xff1f;…...

深入浅出JavaScript常见设计模式:从原理到实战(2)

深入浅出JavaScript常见设计模式&#xff1a;从原理到实战(2) 本文是深入浅出JavaScript常见设计模式&#xff1a;从原理到实战(1)的续集 设计模式是一种在特定情境下解决软件设计中常见问题的通用方案或模板。在特定的开发场景中使用特定的设计模式&#xff0c;可以提升代码质…...

MySQL 主从复制

数据的高可用性、读写分离以及数据备份是至关重要的需求。MySQL 作为一款广泛使用的开源关系型数据库&#xff0c;其主从复制功能为解决这些问题提供了有效的方案。本文将详细介绍 MySQL 主从复制的原理、搭建步骤以及实际应用。 一、MySQL 主从复制原理 1.1 基本概念 MySQL…...

小目标检测的集成融合论文阅读

摘要 小目标检测常因图像模糊和分辨率低而受到阻碍,这给小目标的精确检测和定位带来了重大挑战。此外,传统的特征提取方法往往难以捕捉到这些目标的有效表征,因为下采样和卷积操作会导致小目标细节的模糊化。为了解决这些问题,本研究提出了一种基于集成融合的方法,通过利…...

IP SSL证书常见问题:快速实现HTTPS加密

SSL证书作为实现HTTPS加密和身份验证的关键工具&#xff0c;不仅适用于域名&#xff0c;还能直接绑定IP地址&#xff0c;为IP通信提供安全保障。 一、什么是IP SSL证书&#xff1f; IP SSL证书&#xff08;IP HTTPS证书&#xff09;是一种专为IP地址设计的SSL/TLS证书&#xf…...

Scratch——第20课 辗转相除法/绳子算法

辗转相除法是用于求取最大公约数时需要用到的方法&#xff0c;它还有个名字称为绳子算法&#xff0c;这类题目只要理解辗转相处的原理即可拿下。 一、辗转相除法的基本原理 两个整数的最大公约数不变&#xff0c;当较大数减去较小数后&#xff0c;得到的差值与较小数的最大公…...

MYOJ_1349:(洛谷P3951)[NOIP 2017 提高组] 小凯的疑惑(数学公式套用,两步搞定代码)

提示 本题代码纯属数学的结晶&#xff0c;因此肥肠简单&#xff0c;但需要一定理解。 题目描述 小凯手中有两种面值的金币&#xff0c;两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下&#xff0c;仅凭这两种金币&#xff0c;有些物品他是无法准确支付…...

如何免费把PPT的页面输出为透明的图片-快速制作图新说汇报内容

0.序 经常有朋友问想把PPT中的内容输出为图片&#xff0c;但是PPT里面的officePlus还得付费才可以。不付费就带水印还不高清&#xff0c;关键是还不透明&#xff0c;如果需要透明就设置纯底色去PS里面抠图&#xff08;可自动化&#xff09;&#xff0c;或者手动右键挨个输出。…...

操作系统——第四章(文件管理与文件的逻辑结构)

一、文件系统基础 1.文件的属性 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要是为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性。因此标识符只是操作系统用…...

剑指offer经典题目(七)

目录 动态规划 字符串相关 排序思想相关 链表相关 动态规划 题目1&#xff1a;输入一个长度为n的整型数组array&#xff0c;数组中的一个或连续多个整数组成一个子数组&#xff0c;子数组最小长度为1。求所有子数组的和的最大值。OJ地址 图示如下。 题目解析&#xff1a…...

[RoarCTF 2019]Easy Calc 详解

[RoarCTF 2019]Easy Calc 1 ajax 是进行前后端交互的 但是我们发现一个waf 就是他提示的"calc.php?num"encodeURIComponent($("#content").val()) ?num 的值必须是数字审计一下 foreach 发现了num的限制但是eval是rce的标志所以我们首选的就是使用命令…...