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

单调栈图文详解(附Java模板)

                                                                                 🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝

                                                                             啥是"单调栈",它能解决什么样的问题?          


文章目录

  • 🦩单调栈的概念
  • 🐸适用场景
  • 🦕情形示例
  • 🦄模板例题 —— 洛谷 P5788 【模板】单调栈
  • 🐲进阶例题 —— LeetCode 42. 接雨水
  • 🐳结语


🦩单调栈的概念

🍐单调栈分为单调递增栈单调递减栈,通过使用单调栈我们可以访问到最近一个比它大(小)的元素

    🍊 单调递增栈:单调递栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素
    🍊 单调递减栈:单调递栈就是从栈底到栈顶数据是依次递减,通常是寻找某方向第一个比它大的元素

🐸适用场景

🍋 什么情况适合用单调栈来解决实际问题呢?

    🍒 通常是在数组中需要通过比较前后元素的大小关系来找最近的比它大(小)的元素问题时,可以使用单调栈进行求解。

🦕情形示例

        🐬1. 寻找左边第一个小于它的数

                  🐟题目描述: 给定一个长度为 n ≤ 10 ^5 的数组 a,输出每个数左边第一个比它小的数,如果不存在则输出 − 1。

        🦕【常规思路】

                  🦖双重循环来做,第一重循环枚举每个数,第二重循环找出指定区间类第一个满足条件的数。然而这种做法的复杂度是O(n^2)利用单调栈,我们可以将复杂度降低至O(n)。

    🐸在指针 i 从左往右遍历的过程中,我们可以用一个栈来保存 i 左边的所有元素(不包括i指向的元素),下标越大的元素越接近栈顶下标越小的元素越接近栈底

    🐢每次我们访问栈顶,只要栈顶元素大于等于 a [ i ],我们就将栈顶元素弹出直至栈顶元素小于 a [ i ] ,此时输出栈顶元素并将 a [ i ] 压入栈中。 由于栈中保存了 i 左边的所有元素,所以只要有答案,则答案一定在栈中

     🐉由于每个元素一定会被压入一次且至多弹出一次,因此操作次数至多是2n,故总时间复杂度为O(n)。


            🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳让我们来看看过程图解🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳

        🦩初始化 原数组结果数组,我们去寻找最右边的数字5左边最近的、小于它的数值

在这里插入图片描述

        🦩准备第一个元素“2” 入栈,由于栈空,咱们直接修改结果数组第一个元素值为-1(默认填充了-1,所以我们这里就不修改了)。然后将元素入栈。

在这里插入图片描述
        🦩准备将第二个元素“4” 入栈,此时栈非空,但是栈顶元素小于当前元素,所以,记录结果数组对应值为 栈顶元素的值然后入栈当前元素
在这里插入图片描述
        🦩准备将第三个元素“1” 入栈,此时栈非空,并且栈顶元素大于当前元素,所以我们应该依次弹栈直到栈顶元素小于当前元素或者栈空记录结果数组对应值为栈顶元素的值(这里已经栈空了,所以填充-1),然后入栈当前元素
在这里插入图片描述
        🦩准备将第四个元素“3” 入栈,此时栈非空,并且栈顶元素小于当前元素,所以记录结果数组对应值为 栈顶元素的值,然后入栈当前元素
在这里插入图片描述
        🦩准备将第五个元素“6” 入栈,此时栈非空,并且栈顶元素小于当前元素,所以记录结果数组对应值为 栈顶元素的值,然后入栈当前元素

在这里插入图片描述
        🦩准备将最后一个元素“5” 入栈,此时栈非空,并且栈顶元素大于当前元素,所以我们应该依次弹栈直到栈顶元素小于当前元素或者栈空记录结果数组对应值为栈顶元素的值(这里只弹出一个元素就满足了,并且栈非空,所以填充栈顶元素即可),然后入栈当前元素此时得到的结果数组即为最终结果.
在这里插入图片描述

        🌸Java代码如下:

public class Main {static int N = (int) (1e5 + 10);static int[] a = new int[N], ans = new int[N];static Deque<Integer> stack = new LinkedList<>();static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {in.nextToken();int n = (int) in.nval;for (int i = 0; i < n; i++) {//存数组in.nextToken();a[i] = (int) in.nval;}for (int i = 0; i < n; i++) {//单调栈模板(注意是数值)while (!stack.isEmpty() && stack.peekFirst() >= a[i]) stack.poll();if (!stack.isEmpty()) ans[i] = stack.peekFirst();else ans[i] = -1;stack.push(a[i]);}for (int i = 0; i < n; i++) {//输出结果System.out.print(ans[i] + " ");}}
}

        💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮下面,我们再来看看其他几种情况,基本上都是大同小异。💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮

        🐬2. 寻找左边第一个小于它的数的下标

                  🐟题目描述: 给定一个长度为 n ≤ 10 ^5 的数组 a,输出每个数左边第一个比它小的数的下标,如果不存在则输出 − 1。

                  🦕我们只需要注意几个点,在当前条件下,咱们栈中存的是下标,而不是值,所以需要修改两个地方:a[stack.peekFirst()] 而不是stack.peekFirst()不再是a[i],而是存储对应的下标,具体要修改的地方我已经在注释里写出来了。

        🌸Java代码如下:

public class Main {static int N = (int) (1e5 + 10);static int[] a = new int[N], ans = new int[N];static Deque<Integer> stack = new LinkedList<>();static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {in.nextToken();int n = (int) in.nval;for (int i = 0; i < n; i++) {//存数组in.nextToken();a[i] = (int) in.nval;}for (int i = 0; i < n; i++) {//单调栈模板(注意是下标)while (!stack.isEmpty() && a[stack.peekFirst()] >= a[i]) stack.poll();//注意这里的第二个条件是a[stack.peekFirst()] 而不是stack.peekFirst()if (!stack.isEmpty()) ans[i] = stack.peekFirst();else ans[i] = -1;stack.push(i);//这里也不再是a[i],而是存储对应的下标}for (int i = 0; i < n; i++) {//输出结果System.out.print(ans[i] + " ");}}
}

        🐬3. 寻找右边第一个大于它的数

                  🐟题目描述: 给定一个长度为 n ≤ 10 ^5 的数组 a,输出每个数右边第一个比它大的数,如果不存在则输出 − 1。

                  🦕之前我们是在一个数的左边去寻找,所以让栈去保存这个数左边的所有数,类似地,现在需要让栈去保存这个数右边的所有数。
考虑将数组翻转(倒序遍历),因此情形三变成了「寻找一个数左边第一个大于它的数」属于情形一

        🌸Java代码如下:

public class Main {static int N = (int) (1e5 + 10);static int[] a = new int[N], ans = new int[N];static Deque<Integer> stack = new LinkedList<>();static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {in.nextToken();int n = (int) in.nval;for (int i = 1; i <= n; i++) {//存数组in.nextToken();a[i] = (int) in.nval;}for (int i = n - 1; i > 0; i--) {//单调栈模板(注意是数值)while (!stack.isEmpty() && stack.peekFirst() <= a[i]) stack.poll();if (!stack.isEmpty()) ans[i] = stack.peekFirst();stack.push(a[i]);}for (int i = 0; i < n; i++) {//输出结果System.out.print(ans[i] + " ");}}
}

        🐬4. 寻找右边第一个大于它的数的下标

                  🐟题目描述: 给定一个长度为 n ≤ 10 ^5 的数组 a,输出每个数右边第一个比它大的数的下标,如果不存在则输出 − 1。

                  🦕结合情形二和情形三即可写出代码。

        🌸Java代码如下:

public class Main {static int N = (int) (1e5 + 10);static int[] a = new int[N], ans = new int[N];static Deque<Integer> stack = new LinkedList<>();static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {in.nextToken();int n = (int) in.nval;for (int i = 0; i < n; i++) {//存数组in.nextToken();a[i] = (int) in.nval;}for (int i = n-1; i > 0; i--) {//单调栈模板(注意是下标)while (!stack.isEmpty() && a[stack.peekFirst()] <= a[i]) stack.poll();if (!stack.isEmpty()) ans[i] = stack.peekFirst();stack.push(i);}for (int i = 0; i < n; i++) {//输出结果System.out.print(ans[i] + " ");}}
}

🥕总结以上情形:
    🍏遍历顺序(以怎样的顺序遍历数组 a );
    🍏比较方式(如何比较当前元素和栈顶元素);
    🍏栈中存储的是什么(是元素本身还是元素的下标)。

🦄模板例题 —— 洛谷 P5788 【模板】单调栈

洛谷 P5788 【模板】单调栈
在这里插入图片描述
🌸Java代码如下:(不知道为啥,Java的没AC,C++这样写是AC的)

public class Main {static int N = (int) (3e6 + 10);static int[] a = new int[N], ans = new int[N];static Deque<Integer> stack = new LinkedList<>();static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public static void main(String[] args) throws IOException {in.nextToken();int n = (int) in.nval;for (int i = 1; i <= n; i++) {//存数组in.nextToken();a[i] = (int) in.nval;}for (int i = n; i > 0; i--) {//单调栈模板(注意是下标)while (!stack.isEmpty() && a[stack.peekFirst()] <= a[i]) stack.poll();if (!stack.isEmpty()) ans[i] = stack.peekFirst();stack.push(i);}for (int i = 1; i <= n; i++) {//输出结果System.out.print(ans[i] + " ");}}
}

🐲进阶例题 —— LeetCode 42. 接雨水

42. 接雨水

在这里插入图片描述
    🍏思路:
        🐳遍历heights数组,将其中的元素加入单调递减栈,如果当前柱子的高度大于栈顶柱子的高度,不断出栈,相当于找到左边比当前柱子矮的位置,然后每次出栈之后都要累加一下面积。

    🐸复杂度:
        🦕时间复杂度O(n),n是heights的长度,数组中的每个元素最多入栈出栈一次。
        🦕空间复杂度O(n),栈的空间,最多不会超过heights的长度

    🌸Java代码如下:(相比之前的代码有些许变化,因为这道题需要做的事情会稍微多一点,注释我打在了代码中,请大家耐心阅读

import java.util.Deque;
import java.util.LinkedList;public class Main {public static void main(String[] args) {int[] height = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};System.out.println(trap(height));}public static int trap(int[] height) {
//        int[] height = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};int ans = 0;//总雨水量Deque<Integer> stack = new LinkedList<>();int n = height.length;for (int i = 0; i < n; ++i) {//这里是在干这样一件事情:把当前的这根柱子作为“右柱”,把栈顶的元素作为“中间柱”也叫“接水柱”//(此时还没弹栈),然后把“接水柱”前面的那个柱子,作为“左柱”,有了“左柱”和“右柱”,//咱们的“接水柱”就能接水了,但是它只能接到左右两边更低的那个柱子高度的水。while (!stack.isEmpty() && height[stack.peek()] <= height[i]) {
//上面这个式子说明:“右柱”比栈顶也就是“接水柱”更高,这样的话才能准备接水。
//否则的话,就是满足单调递减栈的,那么我们继续入栈。int top = stack.pop();//拿出前一个柱子if (stack.isEmpty()) break;//如果拿出这根柱子后,前面没有元素了,那就接不了雨水了,因为接雨水的话,至少需要左右两边都有柱子才行。int left = stack.peek();//记录一下拿到的这根柱子的左边那根柱子的高度int currWidth = i - left - 1;//看图推算。
//上面这个式子有人会说:不都是1吗?其实不是的,加入我们连续加入两个0高度的柱子(有点奇怪),
//这个时候,不符合单调栈的定义,那么我们会弹出一个栈,但是由于高度为0,我们也不会因此得到更多的面积,
//因为s = h * w; 不过,这个时候你会发现,中间空出来了一个,准确的说是两格,
//因为前面还有一个0高度的柱子,那么我们下次找到“右柱”的时候就会发现:这个宽度并非是1,
//而是隔开了一定的距离,这个距离和下标有关,看图稍加推导得出距离为:i - left - 1;int currHeight = Math.min(height[left], height[i]) - height[top];//用左右两边更小的柱子来接雨水(木桶原理)ans += currWidth * currHeight;//记录本次所接的雨水量}stack.push(i);//经过上面一顿操作之后,咱们的栈又满足单调性了,于是将当前元素的下标入栈。}return ans;}}

在这里插入图片描述

🐇 我知道,看到这里的你一定特别不容易!!!祝你收获满满,更上一层楼~ 🐇


🐳结语

    🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

    🐟文章粗浅,希望对大家有帮助!

    🐠参考文章:单调栈详解、单调栈

相关文章:

单调栈图文详解(附Java模板)

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349;&#x1f95d; 啥是"单调栈"&#xff0c;它能解决什么样的问题&#xff1f; 文章目录&#x1f9a9;单调栈的概念&a…...

彻底理解Session、Cookie、Token,入门及实战

文章目录Session Cookie的使用Token的使用Session Cookie的使用 1. Session存储数据 HttpSession session request.getSession(); //Servlet底层通过的SESSIONID&#xff0c;获取Session对象。 session.setAttribute("loginTime",new Date()); out.println(&q…...

为什么运营商大数据可以精准获客?

“获客难”&#xff0c;“获客成本高”&#xff0c;一直是困扰企业的大问题&#xff0c;身边的许多朋友在吐槽客户的意向度不高&#xff0c;总是无法成交&#xff0c;员工非常积极主动去跟踪客户了&#xff0c;但始终事倍功半&#xff0c;这就像是老人们常说的一句老话“热脸贴…...

【数据结构】栈的实现

&#x1f4af;&#x1f4af;&#x1f4af; 本篇主要利用数组来实现栈&#xff0c;对于栈的各种操作都作详细介绍&#xff0c;压栈&#xff0c;出栈以及获取栈中元素的操作都是学习栈的必备知识&#xff0c;快来学起来吧&#xff01;&#xff01;&#xff01;©Ⅰ.栈的概念及…...

【链表OJ题(六)】链表分割

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(六)1. 链表…...

C++类中的三大函数(构造,析构,拷贝)

下面一段话与大家共勉&#xff1a;每个人的一生都会遇到很多边界&#xff0c;有些边界可以突破&#xff0c;有些则不能。那些无法突破的边界就是你的极限&#xff0c;而划分边界的标准就是“阈值”。每次突破阈值之后&#xff0c;人生轨迹就会发生剧烈变化&#xff0c;其间需要…...

【2024考研】计算机考研,4轮复习时间安排

文章目录&#x1f3a8;第1轮复习&#xff08;暑假前&系统课&#xff09;英语1/2数学1/2专业课408&#x1f3a8;第2轮复习&#xff08;开学前&真题&#xff09;英语1/2试卷数学1/2试卷专业课408试卷&#x1f3a8;第3轮复习&#xff08;报名前&政治&#xff09;政治试…...

(十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据

系列文章: python网络爬虫专栏 目录 序言 本节学习目标 特别申明 4.7 使用BeautfulSoup解析h...

【经验】项目管理:瀑布式、Scrum

1、瀑布式开发 流程关键词关键人员输出立项简述、周期、预算领导立项申请表、立项评审表策划计划项目经理、QA、CM各种计划书&#xff08;项目、配置、测试等&#xff09;&#xff0c;评审需求功能项目经理功能列表、需求规格书、需求开发计划等&#xff0c;评审设计UML开发设…...

Learning C++ No.17【STL No.7】双端队列

引言&#xff1a; 北京时间&#xff1a;2023/3/17/7:18&#xff0c;刚刚快乐的早锻炼回来&#xff08;不对 &#xff0c;应该说回来有一会了&#xff09;&#xff0c;因为此时我已经吃完早饭&#xff0c;洗过澡了&#xff1b;现在回想起上学期&#xff0c;就算是第二天需要晨跑…...

Snackbar

1.简介 位于底部的提示View 支持侧滑消失 同一时间只有一个 不支持跨Activity展示 国内使用率很低 2.基础使用 2.1 基本展示 Snackbar.make(view, "Content", Snackbar.LENGTH_LONG).show()2.2 设置点击事件 注意不设置点击事件回调&#xff0c;点击按钮的文字不…...

HummerRisk 使用教程:主机检测

1. 概述 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生环境的安全和治理问题。核心能力包括混合云的安全治理和容器云安全检测。 本文将介绍HummerRisk中的主机检测部分功能&#xff0c;包括如何管理主机、管理凭证&#xff0c;以及使用主机检测规…...

【Arduino无线气象站项目】

【Arduino无线气象站项目】 1. 概述2. Arduino无线气象站电路图3. 定制设计电路板4. Arduino无线气象站代码5. 总结1. 概述 使用DHT22传感器测量室外温度和湿度,并使用NRF24L01收发器模块将这些数据无线发送到室内机。在室内机,还有另一个用于测量室内温度和湿度的DHT22传感…...

HTTP详解

一&#xff0c;什么是HTTPHTTP(全称为“超文本传输协议”)&#xff0c;是一种应用非常广泛的应用层协议&#xff0c;之前在《初识网络原理》的博客(初识网络原理_徐憨憨&#xff01;的博客-CSDN博客)中&#xff0c;有详细讲解过TCP/IP五层模型&#xff0c;其中应用层描述了数据…...

cpufreq--处理器功耗控制

cpu 功耗控制 参考框架&#xff1a; cpufreq 框架。 cpufreq 框架提供 cpu 功耗管理接口&#xff0c;以及功耗管理方案。 用户可以通过功耗管理接口&#xff08;以文件形式提供&#xff09;来选择管理方案&#xff0c;并设置相关参数。 管理方案的实现则由具体的驱动来完成。…...

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…...

Oracle 常见报错问题汇总

Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/password; logon denied报错:ORA-01031: insufficient privileges报错:"ORA-01034: ORACLE not available" 和 "ORA-27101: shared memory realm does not exist"报错:“ORA-00119: invalid…...

单片机连接有人云上传数据

首先采用有人物联网的模块 &#xff0c;连接有人云平台服务器 看云平台相关配置配置连接设备在线后 添加设备添加设备完成后 添加变量模板 变量模板的添加方式如下 &#xff1a;本次采用的是标准的MODbus 协议添加一个温度变量温度变量如下显示云平台 下发数据 采集01 03 00 00…...

系统集成项目管理工程师:第18章项目风险管理学习笔记

第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险...

【笔试强训选择题】Day3.习题(错题)解析

文章目录 前言一、Day3习题&#xff08;错题&#xff09;解析二、Day3习题&#xff08;原题&#xff09;练习总结前言 今天我们将进入到第三天的练习&#xff0c;希望能一直坚持下去&#xff0c;不断反思总结错误&#xff0c;得到进步&#xff1b; 一、Day3习题&#xff08;错…...

基于GPT-4的免费代码生成工具

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

Android开发的这一年里,Jetpack的Room源码是怎么狠狠奖励我的?

简述 Android Jetpack的出现统一了Android开发生态&#xff0c;各种三方库逐渐被官方组件所取代。Room也同样如此&#xff0c;逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份&#xff0c;更是因为其良好的开发体验&#xff0c;大大降低了SQLite的使用门槛…...

推荐一款卸载软件的小工具-《UninstallToo》

目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代“添加/删除程序”的工具。它允许您显示隐藏的安装程序&#xff0c;按名称过滤已安装程序的列表&#xff0c;强行写在程序&#xff0c;浏览注册表项目&a…...

线程池——JUC随记8

线程池使用方式 1、一池N线程&#xff08;Executors.newFixedThreadPool(n)&#xff09; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ExecutorDemo {public static void main(String[] args) {ExecutorService execu…...

SpringCloudAlibaba微服务调用组件-Feign

SpringCloudAlibaba微服务调用组件-Feign 本项目代码与笔记已存放在Gitee仓库 地址&#xff1a; 代码&#xff0c;笔记 文章目录SpringCloudAlibaba微服务调用组件-Feign1. 什么是Feign1.1 优势2. Spring Cloud Alibaba快速整合OpenFeign1&#xff09;引入依赖2&#xff09;编写…...

高效学习方法论

2023.03.17 《程序员的三门课&#xff1a;技术精进、架构修炼、管理探秘 / 于君泽等著》学习笔记 学会学习一、高效学习的方法1、管理好自己的目标1&#xff09;评估能力2&#xff09;制定目标3&#xff09;评估目标2、利用好碎片时间3、在同一时间只做一件事二、高效学习的途径…...

C语言结构体(一篇学会)

C语言结构体 在C语言中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许用户将不同类型的数据组合在一起。结构体由多个变量组成&#xff0c;这些变量称为结构体的成员。结构体成员可以是不同的数据类型&#xff0c;如整数、浮点数、字符或其他结构体等。 结构体…...

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World&#xff01; 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。但是在Ubuntu 下如何进…...

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够&#xff0c;懂技术/懂业务/懂管理的综合型人才&#xff0c;才是技术团队中的绝对核心。 不仅仅是架构师&#xff0c;所有的技术高端岗位&#xff0c;对人才的综合能力都有较高的标准。 架构路线的总设计师 规…...

Java:SpringBoot实现ApplicationEvent事件的监听和发布

通过发布订阅模式实现数据的异步处理&#xff0c;比如异步处理邮件发送 新建SpringBoot项目 项目结构 . ├── pom.xml └── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ …...

做网站有没有前途/怎么去推广自己的网站

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号&#xff1a;96933959 文件读取 os.File 封装了文件相关操作 os.File Pkg Doc 读写参数 文件打开模式&#xff1a; const (O_RDONLY int syscall.O_RDONLY // 只读模式打开文件O_WRONLY int syscall.O_WRONLY // 只写模式…...

wordpress 如何修改导航链接/seo公司

“什么是数据产品经理”这个问题的本质其实是在问“数据产品经理和产品经理到底有什么区别?”&#xff0c;金老师先来看看他们之间的区别吧!用数据来指导产品设计已经不是什么新鲜事了&#xff0c;几乎所有的产品经理都需要依赖数据做产品决策——从早期产品开发时的用户研究&…...

厦门外贸网站找谁/网站平台搭建

htmlxamlfont标签存在单独font标签只是其他标签属性字体加粗<b></b>FontWeight"Bold"背景bgcolor"aliceblue"Background"AliceBlue"对齐align"center" HorizontalAlignment"Center" VerticalAlignment"Cen…...

做二手网站赚钱不/5151app是交友软件么

前言 本文我们来对Lucene具体如何进行数据的搜索&#xff0c;进行详细的介绍。 环境准备 我们直接使用在上一篇文章中的应用代码案例。 因为索引和存储两者是分开的&#xff0c;对于某一个字段我们可以建立索引&#xff0c;但是不存储&#xff0c;我们依然可以对此字段进行…...

wordpress插件聊天室小人/郑州seo推广优化

红色来源于山脉&#xff0c;象征着狂躁、愤怒、混乱&#xff0c;血雨腥风&#xff0c;电光火石。蓝色来源于海岛&#xff0c;象征着控制、幻觉、诡计&#xff0c;运筹帷幄&#xff0c;谋定后动。绿色来源于树林&#xff0c;象征着生命、蛮力、成长&#xff0c;横冲直撞&#xf…...

专业做外挂的网站/百度信息流广告投放

版本信息&#xff1a;SDE9.3、ORACLE11g1、SDE锁表检查处理1.1、查询并删除锁表进程(以sys或者system用户运行)select t1.username, t.object_id, t.session_id, t1.serial#,t.oracle_username,t.os_user_name, t.process from v$locked_object t,v$session t1 where t.session…...