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

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中,我们学习了栈和队列的基本知识,以及它们对应都有哪些方法,在什么应用场景下如何使用,并且还对它们进行了模拟实现,而其实对于栈和队列的相关知识还远不止于此,而今天我们就对栈与队列进行复盘,认识更多使用它们的场景,夯实代码功底吧~

一、常考面试题-思维

以下习题在leetcode都是比较热门的题,并且大部分都能够代表一系列的解题方式,推荐大家自己多尝试几遍,练熟练透哦~

第一题、最小栈

📚 思路提示

该题要求我们实现一个拥有"能够直接获取栈内最小元素方法"的栈,并且要求时间复杂度为O(1)要知道我们之前所学习的栈可是没有这种高能的方法的~而这是为什么呢?

因为当我们把元素压入栈中之后想要再对其中的元素进行访问是做不到的,如果要强行访问,那么就需要将栈顶元素一个个拿出来,而当找到最小值的那一刻,该栈的元素也就都被掏空了,也就更不用说时间复杂度还达到了O(n)。

当然,做不到是因为只有一个栈,而我们可以采取创建辅助栈的方式,来模拟实现这种"O(1)查找最小元素"的栈具体的实现步骤如下所述

📕 创建一个辅助栈,用于存储当前"最小栈"中的最小值

📕 只有"入栈元素 <= 最小值"时,才入最小栈( == 时必须入栈,否则可能发生"普通栈有两个最小值,而最小栈只有一个最小值,最小值出栈后,最小栈中就不是当前最小值了"的情况)

📕 需要注意,"最小栈"中的最小值可能被出栈,所以辅助栈存储的最小值也要跟随一起改变

📕 注意出栈操作时,保证两个栈都不为空

图解

📖 代码示例

class MinStack {Stack<Integer> stack1;Stack<Integer> stack2;int n = Integer.MAX_VALUE;public MinStack() {stack1 = new Stack<>();stack2 = new Stack<>();}public void push(int node) {if (node < n) {n = node;}stack2.push(n);stack1.push(node);}public void pop() {stack1.pop();stack2.pop();if(!stack2.isEmpty() && stack2.peek() >= n){n = stack2.peek();}if(stack2.isEmpty()){n = Integer.MAX_VALUE;}}public int top() {return stack1.peek();}public int getMin() {return stack2.peek();}
}

第二题、字符串解码

📚 思路提示

该题要求我们将"数学表达式的字符串"改写成"展开后的字符串",光看测试用例大家或许觉得简单,但看似简单,其实需要注意的细节还是很多的,比如它还有三个测试用例:

这样看起来就有些让人抓心挠肝,难受的不行了。

而对于这题的解决方式,我们仍然是采用"辅助栈"的方法而且这次我们需要不止一个,而是需要"两个辅助栈"。

至于需要用两个辅助栈,是因为我们不能光存"倍数"或者"字符",因为我们想达到O(n)的时间复杂度,就要求我们遍历一次成功,但我们可以注意到:

以示例2为参考例子"3 [ a 2 [ c ] ]"    ==》 "accaccacc"

想要结果有"cc",就需要将 [ c ] 于它之前的 2 相对应,而我们遍历到 [ c ] 的时候,已经越过了 2 ,所以如果我们想不存储数字,是做不到这一点的。

而如果想有"acc",我们就必须再将 a 接在 cc 的前边,但是当我们合成 cc 后,早就遍历过了 a ,所以我们也必须用一个栈存储字符,才能得到最终的字符串。

而具体怎么存呢?我们可以通过一个"res"来存储临时的字符串,"multi"来存储临时的数字,' [ ' 来作为分段的符号,

📕 每当遇到 ' [ ' ,我们便将此时这一组字符串于数字存入栈中,以便不与其他部分搞混

📕 每当遇到 ' ] ' ,我们便将此时的"临时字符串"与"栈内数字"进行结合

(因为 ' [ ' 前数字是与 ' [ ' 后字符串结合后的因子,因此二者匹配)

图解

📖 代码示例

class Solution {public static String decodeString(String s) {int multi = 0;StringBuilder res = new StringBuilder();Stack<String> stack1 = new Stack<>();Stack<Integer> stack2 = new Stack<>();char[] str = s.toCharArray();for(int i = 0;i < str.length;i++){char c = str[i];if(c == '['){stack1.push(res.toString());stack2.push(multi);multi = 0;res = new StringBuilder();}else if(c == ']'){StringBuilder ss = new StringBuilder();int n = stack2.pop();for(int j = 0;j < n;j++){ss.append(res);}res = new StringBuilder(stack1.pop() + ss);}else if(Character.isDigit(c)){multi = multi * 10 + (c - 48);}else {res.append(c);}}return res.toString();}
}

第三题、逆波兰表达式求值

📚 思路提示

此题并不难,只要搞清了逆波兰表达式如何求,并且逆波兰表达式如何再还原成原式就好了~

所以我们直接看图,只要了解了过程,这题也就迎刃而解了~

图解

算数计算式转逆波兰表达式

波兰表达式求表达式的值:

(用后缀表达式求结果)

📕 遇到数字 放入栈内 遇到运算符 弹出栈顶

📕 两个元素 第一个元素是右操作数 第二个元素是左操作数

📕 然后再将结果放回栈内

📖 代码示例

class Solution {public int evalRPN(String[] tokens) {Stack stack = new Stack();for(int i = 0;i < tokens.length;i++){String s = tokens[i];if(!doNum(s)){stack.push(Integer.valueOf(s));} else {int a = (int)stack.pop();int b = (int)stack.pop();switch(s){case "+":stack.push(b + a); break;case "-":stack.push(b - a); break;case "*":stack.push(b * a); break;case "/":stack.push(b / a); break;}}}return (int)stack.pop();}public boolean doNum(String s){if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){return true;}return false;}
}

二、常考面试题-单调栈

"他向远方望去,无法看到高山背后的矮山,只能看到一座座更高的山峰。"

(引用灵神的话~)

我们上面已经练习了一部分栈的习题,那么关于这里的单调栈又是什么呢?其实和名字一样

单调栈:要求从栈的一端,到栈的另一端,元素必须是呈单调递增或单调递减的~

而单调栈分为两种,一种是单调递增栈,一种是单调递减栈~

📕 单调递增栈:从栈低到栈顶,元素单调递增的栈

📕 单调递减栈:从栈低到栈顶,元素单调递减的栈

我们可以举一个例子来看一下,如何通过一组数据来获得我们的单调栈

图解(该栈为单调递减栈)

那么单调栈应该运用于哪些场景呢?让我们做几道例题试试~

第一题、商品折扣后的最终价格

📚 思路提示

我们分析一下这道题,我们主要需要做的就是"找出当前价格后的第一个小于它的价格"并且找到我们需要的较小价格后,就可以将当前价格折扣后的价格计算出来了,也就是说可以将它舍弃掉了(也就是出栈~)

那么可以将价格数组 prices 进行遍历,使用一个辅助栈来将未被解决的价格(的下标)存入栈中。

然后继续遍历与压栈直到遇到比目前栈顶价格更小的价格(也就是目标的折扣),就可以算出目前栈顶价格的折扣价格,并将其出栈操作~

(可能目前的 prices[i] 价格也小于栈顶下一个价格,所以此处应用 "while" 而不是 "if")

最后将栈中剩余未被解决的价格,直接原价出售即可~

怎么样,很明显,这也是一道单调栈问题吧~其实单调栈的辨识度还是很高的,只要题中要求你找到一个比一个数值更高/低的元素,并且分析后可以省略之前元素。那么它大概率就是一个单调栈问题~

图解

📖 代码示例

class Solution {public int[] finalPrices(int[] prices) {Deque<Integer> deque = new ArrayDeque<>();int len = prices.length;int[] arr = new int[len];for(int i = 0;i < len;i++){int price = prices[i];while(!deque.isEmpty() && price <= prices[deque.peek()]){int index = deque.pop();arr[index] = prices[index] - prices[i];}deque.push(i);arr[i] = prices[i];}return arr;}
}

第二题、每日温度

📚 思路提示

这题的主要思路与上一题还是基本一致的~只不过上一题要找的是越来越小的元素(单调递增栈),而我们这题需要找的是越来越大的元素(单调递减栈)

一样的思路,遍历温度数组,将未被解决的温度存入栈中(下标)。

如果找到比栈顶温度更高的温度,则计算出栈顶温度与该温度相差天数,随后将已得出结果的栈顶温度出栈,将目前温度入栈

最后栈中未被解决的温度,将它们的天数用0代替。

图解

📖 代码示例

class Solution {public int[] dailyTemperatures(int[] temperatures) {int len = temperatures.length;int[] arr = new int[len];Deque<Integer> stack = new ArrayDeque<>();stack.push(0);for(int i = 0;i < len;i++){int num = temperatures[i];while(!stack.isEmpty() && num > temperatures[stack.peek()]){int index = stack.pop();arr[index] = i - index;}stack.push(i);}return arr;}
}

第三题、股票价格跨度

📚 思路提示

而题中要求我们将传入的数据,一个个往前进行比较,如果前一天的价格小于今天的价格,那么"入栈的股票价格跨度" += "栈顶元素的股票价格跨度",并且前一天的前一天也可能小于今天得价格,所以还是while而不是if~(那么这就是一个单调递减栈)

前两道题让我们完成的是一个"方法"而这道题是想让我们设计实现一个"类"

前两道题给我们的是一个数组,我们就对数组进行一个遍历,然后通过每一步遍历,同时检查并删改栈顶元素即可,而这题我们自己输入元素,而并非给我们一个数组。

而对于这一点不同,我们的解题方法需要有什么修改呢?让我们思考一下

之前我们的栈内只存储了一个元素(下标),这是因为我们的数据值在题中所给出的数组中存储着~而当题目并没有给我们数组,而是让我们自己输入数据时,我们的栈便不能只存储一个数据了,而是必须将每日的股票价格与跨度同时存储,所以我们创建的栈应该是<int[]>类型的~

需要注意的是

📕 由于同时存储了跨度,当对不满足单调性的数据进行出栈时,我们仅仅是想在后续访问过程中忽略该结点的股票价格,而忽略并不代表消失,所以即便后续访问时跳过它,但它的天数仍是做数的!

📕 所以出栈时,我们需要同时对 "入栈的股票价格跨度" += "栈顶元素的股票价格跨度",这不仅仅是因为我们要求出该天的跨度,也是为了后续股票访问到这里时,也一并算上被省略的天数!

图解

📖 代码示例

class StockSpanner {Deque<int[]> stack;public StockSpanner() {stack = new ArrayDeque<int[]>();}public int next(int price) {int day = 1;while(!stack.isEmpty() && stack.peek()[1] <= price){day += stack.pop()[0];}stack.push(new int[] {day,price});return day;}
}

那么这次关于栈与队列(常考面试题)以及(单调栈)的知识,就为大家分享到这里啦,作者能力有限,如果有讲得不清晰或者不正确的地方,还请大家在评论区多多指出,我也会虚心学习的!那我们下次再见哦

相关文章:

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中&#xff0c;我们学习了栈和队列的基本知识&#xff0c;以及它们对应都有哪些方法&#xff0c;在什么应用场景下如何使用&#xff0c;并且还对它们进行了模拟实现&#xff0c;而其实对于栈和队列的相关知识还远不止于此&#xff0c;而今天我们就对栈与队列进行…...

Python Pandas(11):Pandas 数据可视化

数据可视化是数据分析中的重要环节&#xff0c;它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式&#xff0c;数据可视化将复杂的数字和统计信息转化为易于理解的图像&#xff0c;从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...

wordpress模板文件结构超详解

wordpress网站建设中&#xff0c;主题的制作是最为核心的环节。了解模板文件结构是模板制作的第一步&#xff0c;本文所讲的模板文件结构包括两部分&#xff0c;一是指以文件名为概念的文件结构&#xff0c;二是指文件内容的代码结构。 一、如何使模板文件起作用 ↑ wordpres…...

大脑神经网络与机器神经网络的区别

大脑神经网络(生物神经网络)与机器神经网络(人工神经网络,ANN)虽然名称相似,但在结构、功能、学习机制等方面存在显著差异。以下是两者的主要区别: 1. 基础结构与组成 大脑神经网络: 由 生物神经元(约860亿个)通过突触连接形成动态网络。 神经元通过电化学信号(动作…...

【H5自适应】高端科技类pbootcms网站模板 – 三级栏目、下载与招聘功能支持

(H5自适应)高端大气的科技类pbootcms网站模板 带三级栏目、下载和招聘功能 后台地址&#xff1a;您的域名/admin.php 后台账号&#xff1a;admin 后台密码&#xff1a;123456 为了提升系统安全&#xff0c;请将后台文件admin.php的文件名修改一下。修改之后&#xff0c;后台…...

SQL-leetcode—1661. 每台机器的进程平均运行时间

1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂网站的…...

C++ Primer 跳转语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

清华大学:DeepSeek 如何赋能职场应用(35 页 PDF)

原来已经分享过清华大学的 DeepSeek&#xff1a;从入门到精通&#xff08;100页PDF&#xff09; 现在又来第二弹&#xff1a;《DeepSeek 如何赋能职场应用&#xff1f;从提示语技巧到多场景应用》 PDF里介绍了 DeepSeek 这一人工智能工具及其在职场中的应用&#xff0c;从基础…...

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…...

开发指南098-logback-spring.xml说明

可执行的工程src\main\resources目录有logback-spring.xml文件用于配置日志。配置日志有些容易犯晕的地方&#xff0c;这里列出&#xff1a; 1、<logger>标签的优先级高于<root>标签‌&#xff1a;所以&#xff0c;如果<logger>标签指定了某个具体的包或类的…...

【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法

最开始引入了1.7.5版本的slf4j-log4j依赖包&#xff0c;但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错&#xff1a; 进入提示的slf4j网站中可以找到从2.0.0版本开始&#xff0c;slf4j-log4j已经被slf4j-reload4j取代&#xff1…...

【STM32】H743的以太网MAC控制器的一个特殊功能

调试743的MAC&#xff0c;翻阅手册的时候&#xff0c;发现了一个有意思的功能 混杂模式 H743的MAC控制器&#xff0c;可以设置为混杂模式&#xff0c;这就意味着它可以做一些网络监控的应用&#xff0c;譬如连接具备端口镜像功能的交换机&#xff0c;然后直接代替PC实现网络数据…...

Java LinkedList(单列集合)

LinkedList 是 Java 中实现了 List 接口的一个类&#xff0c;它属于 java.util 包。与 ArrayList 不同&#xff0c;LinkedList 是基于双向链表实现的&#xff0c;适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现&#xff1a;LinkedList 使用双向…...

docker compose快速部署kafka-connect集群

先部署kafka集群&#xff0c;启动 参考&#xff1a;docker compose部署kafka集群-CSDN博客 创建timezone文件&#xff0c;内容填写Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…...

docker 部署nginx,nginx 504

遇到问题 原因&#xff1a; 因为用的docker 部署nginx, docker 应用与服务之间的端口未开放&#xff0c;导致访问不到服务。...

RealClip正式发布:重新定义轻量化数字内容交互体验

在移动互联网流量红利逐渐见顶的当下&#xff0c;用户对即时性、碎片化娱乐与交互体验的需求持续攀升。轻量化小游戏、VR互动、数字孪生、工业仿真等内容形态迅速崛起&#xff0c;但开发者却面临两大核心矛盾&#xff1a;如何将高性能互动内容轻量化嵌入现有应用中&#xff1f;…...

SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)

假设你已经了解SQLMesh是什么&#xff0c;以及其他应用场景。如果没有&#xff0c;我建议你先阅读《SQLMesh系列教程-1&#xff1a;数据工程师的高效利器-SQLMesh》。 在本文中&#xff0c;我们将完成一个小项目或教程&#xff0c;以帮助你开始使用SQLMesh。你可以选择一步一步…...

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…...

#渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 1. 漏洞原理 2. 漏洞定位 3. 攻击验证示…...

试试DeepSeek写prompt+stable diffusion生成漫画

#deepseek #stable diffusion 模型&#xff1a;dreamshaperXL_v21TurboDPMSDE.safetensors 一、情节拟定 漫画情节由deepseek自编自导&#xff0c;画幅为四张。 Prompt 1: 魔法觉醒 "一个平凡的少年在阁楼发现一本古老的魔法书&#xff0c;书页散发着微弱的蓝光。画…...

java面试题之 int和Integer的区别

int和Integer的区别 1、Integer是int的包装类&#xff0c;int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用&#xff0c;而int变量不需要 3、Integer实际是对象的引用&#xff0c;当new一个Integer时&#xff0c;实际上是生成一个指针指向此对象&#xff1b…...

Spring Bean的生命周期

1、对象实例化 2、属性设置 3、初始化 4、使用 5、销毁 示例代码如下&#xff1a; import org.springframework.stereotype.Component;Component public class SpringBeanA {public SpringBeanA() {System.out.println("第一步&#xff1a;实例化(spring对象&#x…...

Vue 发送 PDF 文件链接到 WinForm 程序进行打印

Vue 发送 PDF 文件链接到 WinForm 程序进行打印的完整流程如下&#xff1a; 1. Vue 端 Vue 通过 fetch 或 axios 发送 PDF 文件的 URL 给 WinForms 程序&#xff08;WinForms 需要开启一个本地 API&#xff09;。 <template><div><button click"sendPri…...

Vue笔记(十)

一、AI的基本认知 二、ChatGPT的基本使用 三、AI插件--Copilot入门 1.Copilot是由OpenAI和GitHub合作开发的AI编程辅助插件&#xff0c;基于大量代码训练&#xff0c;能根据上下文自动生成代码建议。 2.安装与配置&#xff1a;在常用代码编辑器&#xff08;如Visual Studio Cod…...

使用LangChainV3.0加载PDF文件并进行总结

LangChain目前已经更新到了V3版本&#xff0c;之前一直使用的V1版本&#xff0c;有很多方法都需要自己去封装&#xff0c;这次重新看了V3版本的API文档&#xff0c;很多方法都十分便利&#xff0c;调用方法简单明了十分方便&#xff0c;下面就来展示下这次对于PDF文件加载的优化…...

玩转大语言模型——使用Kiln AI可视化环境进行大语言模型微调数据合成

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…...

EasyRTC智能硬件:小体积,大能量,开启音视频互动新体验

在万物互联的时代&#xff0c;智能硬件正以前所未有的速度融入我们的生活。然而&#xff0c;受限于硬件性能和网络环境&#xff0c;许多智能硬件在音视频互动体验上仍存在延迟高、卡顿、回声等问题&#xff0c;严重影响了用户的使用体验。 EasyRTC智能硬件&#xff0c;凭借其强…...

vue知识点5

1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...

qt的QSizePolicy的使用

使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中&#xff0c;QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为&#xff0c;可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…...

基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计

基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计 在 iOS 上实现一个基于 FFmpeg 和 OpenGLES 的视频预览和录制功能,需要结合 FFmpeg 的强大音视频处理能力和 OpenGLES 的高效图形渲染能力。以下是一个完整的技术方案设计,包含项目的架构设计、模块划分、技术选…...

如何保障 MySQL 和 Redis 的数据一致性

在现代分布式系统中&#xff0c;确保不同数据存储&#xff08;如 MySQL 和 Redis&#xff09;之间的一致性是一个常见的挑战。MySQL 是一种关系型数据库管理系统&#xff0c;而 Redis 是一种内存中的键值存储系统&#xff0c;通常用于缓存和快速访问数据。本文将详细介绍几种保…...

【LeetCode Hot100 子串】和为 k 的子数组、滑动窗口最大值、最小覆盖子串

子串 1. 和为 k 的子数组题目描述解题思路主要思路步骤 时间复杂度与空间复杂度代码实现 2. 滑动窗口最大值题目描述解题思路双端队列的原理&#xff1a;优化步骤&#xff1a; Java实现 3. 最小覆盖子串题目描述解题思路滑动窗口的基本思路&#xff1a;具体步骤&#xff1a;算法…...

【CLIP系列】4:目标检测(ViLD、GLIP)

目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来&#xff0c;作者是把CLIP模型当成一个Teacher&#xff0c;去蒸馏他自己的网络&#xff0c;从而能Zero Shot去…...

vue-谷歌浏览器安装vue-devtools插件

文章目录 一、谷歌浏览器安装vue-devtools1.1、方式一&#xff1a;直接下载crx并安装 本文讲解谷歌浏览器安装vue-devtools插件的步骤。 注意&#xff1a;以下vue-devtools插件都是vue2版本的。 一、谷歌浏览器安装vue-devtools 1.1、方式一&#xff1a;直接下载crx并安装 …...

【安全测试】0基础新手学Web安全测试笔记(一)

文章目录 一、关于账号密码的漏洞二、关于验证码的漏洞三、Burp工具的使用四、渗透测试1. 渗透测试类型2. 脆弱性评估 五、常见的应用安全风险1. 注入2. 失效的身份认证3. 敏感数据泄露4. XML外部实体(XXE)5. 失效的访问控制6. 安全配置错误7. 跨站脚本:(XSS)8. 不安全的反序列…...

初窥强大,AI识别技术实现图像转文字(OCR技术)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作&#xff0c;主要擅长领域有&#xff1a;python…...

JDK 14,15,17的一些新特性(部分常用)

1&#xff1a;instanceof&#xff08;后&#xff0c;使用不再需要墙转&#xff09; 2&#xff1a;switch语句增强 1&#xff1a;支持lmbda&#xff0c;自动防击穿&#xff0c;有返回值 2&#xff1a;支持case多个值&#xff0c;复杂逻辑结果支持yield返回 3&#xff1a;字符串…...

架构设计系列(二):CI/CD

一、概述 CI/CD 是 持续集成&#xff08;Continuous Integration&#xff09; 和 持续交付/持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09; 的缩写&#xff0c;是现代软件开发中的一套核心实践和工具链&#xff0c;旨在提高软件交付的效率、质量…...

二十六、使用docsify搭建文档管理平台

特性 无需构建,写完文档直接发布容易使用并且轻量 (~19kB gzipped)智能的全文搜索提供多套主题丰富的 API...

SpringMVC学习使用

一、SpringMVC简单理解 1.1 Spring与Web环境集成 1.1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的&#xff0c;但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(sp…...

MySQL | MySQL安装教程

MySQL | MySQL安装教程(压缩包&#xff08;ZIP&#xff09;安装-详细版) &#x1fa84;个人博客&#xff1a;https://vite.xingji.fun MySQL概述 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;MySQL AB公司被Sun公司收购&#xff0c;Sun公…...

Vite入门指南

一、什么是Vite&#xff1f; Vite&#xff08;法语意为"快速"&#xff09;是由Vue作者尤雨溪开发的新型前端构建工具。它基于原生ES模块&#xff08;ESM&#xff09;实现&#xff0c;具有以下核心优势&#xff1a; 极速启动&#xff1a;冷启动时间比Webpack快10-10…...

DeepSeek 助力 Vue 开发:打造丝滑的进度条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

左移架构 -- 从攒批,湖仓到使用数据流的实时数据产品

编辑导读: 这篇文章翻译自 Kai Waehner的 《The Shift Left Architecture – From Batch and Lakehouse to Real-Time Data Products with Data Streaming》。文章通过数据产品的概念引出了如何创建可重复使用的数据产品使企业能够从当前和未来的数据中获得价值。基于构建数据产…...

用java实现word(docx)转换为pdf格式文档(简单版)

导入依赖 <dependency> <groupId>com.documents4j</groupId> <artifactId>documents4j-local</artifactId> <version>1.0.3</version> </dependency> <dependency>…...

【云安全】云原生- K8S etcd 未授权访问

什么是etcd&#xff1f; etcd 是一个开源的分布式键值存储系统&#xff0c;主要用于存储和管理配置信息、状态数据以及服务发现信息。它采用 Raft 共识算法&#xff0c;确保数据的一致性和高可用性&#xff0c;能够在多个节点上运行&#xff0c;保证在部分节点故障时仍能继续提…...

【Elasticsearch】字符过滤器Character Filters

在 Elasticsearch 中&#xff0c;字符过滤器&#xff08;Character Filters&#xff09;是文本分析器的重要组成部分&#xff0c;用于在分词之前对原始文本进行预处理。它们可以对字符流进行转换&#xff0c;例如添加、删除或更改字符。Elasticsearch 提供了三种内置的字符过滤…...

网络工程师 (35)以太网通道

一、概念与原理 以太网通道&#xff0c;也称为以太端口捆绑、端口聚集或以太链路聚集&#xff0c;是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作&#xff0c;共同承担数据传输任务&#xff0c;从而提高了网络的传输能力和可靠性。 二…...

浏览器网络请求全流程深度解析

一、核心流程概述 现代浏览器的网络请求过程是一个分层协作的精密系统&#xff0c;涉及应用层协议、传输层协议、操作系统内核及网络基础设施的协同工作。整个过程可抽象为以下关键阶段&#xff1a; 请求构建与初始化DNS解析与寻址TCP连接建立HTTP协议交互响应处理与资源解析…...

arduino扩展:Arduino Mega 控制 32 个舵机(参考表情机器人)

参考&#xff1a;表情机器人中使用22个舵机的案例 引言 在电子制作与自动化控制领域&#xff0c;Arduino 凭借其易用性和强大的扩展性备受青睐。Arduino Mega 作为其中功能较为强大的一款开发板&#xff0c;具备丰富的引脚资源&#xff0c;能够实现复杂的控制任务。舵机作为常…...