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

CCF-202206-2-寻宝!大冒险!

目录

题目背景

问题描述

一、思路:

二、实现方法(C++)

2.1、方法一(int储存)

思路:

C++实现如下:

2.2、方法二(结构体储存)

思路:

注意:边界判断

C++实现如下:

2.3、方法三(map储存,int为key,map为value)

思路:

C++实现如下:

2.4、方法四(map储存,pair为key,int为value)

思路:

C++实现如下:

三、遇到的问题

3.1、二维动态数组

3.2、vector作为value

3.3、结构体数组


 

题目背景

暑假要到了。可惜由于种种原因,小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到……

某天,小 P 获得了一张神秘的藏宝图。

问题描述

西西艾弗岛上种有 n 棵树,这些树的具体位置记录在一张绿化图上。
简单地说,西西艾弗岛绿化图可以视作一个大小为 (L+1)×(L+1) 的 01 矩阵 A,
地图左下角(坐标 (0,0))和右上角(坐标 (L,L))分别对应 A[0][0] 和 A[L][L]。
其中 A[i][j]=1 表示坐标 (i,j) 处种有一棵树,A[i][j]=0 则表示坐标 (i,j) 处没有树。
换言之,矩阵 A 中有且仅有的 n 个 1 展示了西西艾弗岛上 n 棵树的具体位置。

传说,大冒险家顿顿的宝藏就埋藏在某棵树下。
并且,顿顿还从西西艾弗岛的绿化图上剪下了一小块,制作成藏宝图指示其位置。
具体来说,藏宝图可以看作一个大小为 (S+1)×(S+1) 的 01 矩阵 B(S 远小于 L),对应着 A 中的某一部分。
理论上,绿化图 A 中存在着一处坐标 (x,y)(0≤x,y≤L−S)与藏宝图 B 左下角 (0,0) 相对应,即满足:
对 B 上任意一处坐标 (i,j)(0≤i,j≤S),都有 A[x+i][y+j]=B[i][j]。
当上述条件满足时,我们就认为藏宝图 B 对应着绿化图 A 中左下角为 (x,y)、右上角为 (x+S,y+S) 的区域。

实际上,考虑到藏宝图仅描绘了很小的一个范围,满足上述条件的坐标 (x,y) 很可能存在多个。
请结合西西艾弗岛绿化图中 n 棵树的位置,以及小 P 手中的藏宝图,判断绿化图中有多少处坐标满足条件。

特别地,藏宝图左下角位置一定是一棵树,即 A[x][y]=B[0][0]=1,表示了宝藏埋藏的位置。

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的三个正整数 n、L 和 S,分别表示西西艾弗岛上树的棵数、绿化图和藏宝图的大小。

由于绿化图尺寸过大,输入数据中仅包含 n 棵树的坐标而非完整的地图;即接下来 n 行每行包含空格分隔的两个整数 x 和 y,表示一棵树的坐标,满足 0≤x,y≤L 且同一坐标不会重复出现。

最后 (S+1) 行输入小 P 手中完整的藏宝图,其中第 i 行(0≤i≤S)包含空格分隔的 (S+1) 个 0 和 1,表示 B[S−i][0]⋯B[S−i][S]。
需要注意,最先输入的是 B[S][0]⋯B[S][S] 一行,B[0][0]⋯B[0][S] 一行最后输入。

输出格式

输出到标准输出。

输出一个整数,表示绿化图中有多少处坐标可以与藏宝图左下角对应,即可能埋藏着顿顿的宝藏。

样例 1 输入

5 100 2
0 0
1 1
2 2
3 3
4 4
0 0 1
0 1 0
1 0 0

样例 1 输出

3

样例 1 解释

绿化图上 (0,0)、(1,1) 和 (2,2) 三处均可能埋有宝藏。

样例 2 输入

5 4 2
0 0
1 1
2 2
3 3
4 4
0 0 0
0 1 0
1 0 0

样例 2 输出

0

样例 2 解释

如果将藏宝图左下角与绿化图 (3,3) 处对应,则藏宝图右上角会超出绿化图边界,对应不成功。

子任务

40% 的测试数据满足:L≤50;

70% 的测试数据满足:L≤2000;

全部的测试数据满足:n≤1000、L≤109 且 S≤50。

提示

实际测试数据中不包括答案为 0 的用例。


一、思路:

毕竟是CCF第二题,所以一上来就知道不能构造一张很大的地图,一定是从很小的藏宝图来入手。所以想到了将每棵树作为一个小地图(大小为藏宝图的小地图)的左下角的位置,为每棵树维护一个小地图,最后将每棵树维护的小地图与藏宝图进行比对即可。

还有一个思路就是,不维护那么多的小地图,只需要将大地图中的树的坐标存到c++的容器里,每次检查一棵树是否能作为有宝藏的地图时,就检查藏宝图内所有树的坐标是否都能在以这棵树为左下角的(S+1)*(S+1)区域内找到,如果可以便满足题目要求的条件。

当然,为了节省运算时间和比对的次数,我么可以在处理每棵树的时候就为其储存一个值存放其(S+1)*(S+1)区域内拥有的树木的总数量,以及其(S+1)*(S+1)区域是否超过大地图的边界,这样我们在判断时先比对这两个常量与藏宝图的关系,就可以节省一部分匹配的时间。

由于开始写这个题的时候对C++的stl容器还不是很了解,在不断试错的过程中,熟悉了很多容器的使用方法,下面通过若干个实现例子分别解释。

注: 写这个题目写了十几遍都不知道错在哪,最后发现是自己没理解题目,样例给的树的坐标都是从小到大的(从左下角到右上角)导致我以为测试数据都是这个规律,以至于开始写了十几遍都没找到错误,一直都是零分,接下来的实现方法均是100写法,同时可以帮助加深对C++ stl容器的理解和使用。


二、实现方法(C++)

2.1、方法一(int储存)

思路:

在输入每颗树的时候就判断其构成的小地图是否越界,如果越界其必不可能用有宝藏,故将A[i][3] 置为 -1,表示其越界。

接着循环输入的每一棵树,为其构造一个藏宝图大小的小地图,同时储存其拥有的树的数量。

最后进行比较,遇到满足条件的树会将num+1。

C++实现如下:

#include<iostream>
using namespace std;int main() {int n,L,S;cin>>n>>L>>S;
int A[1001][4];
int B[51][51];
int temp[1001][51][51];
int cnt;for(int i = 0; i<n; ++i) {int x,y;cin>>x>>y;A[i][0] = x;A[i][1] = y;if(x+S>L||y+S>L) {A[i][3] = -1;}}for(int i = S; i>=0; --i) {for(int j = 0; j<=S; ++j) {cin>>B[i][j];if(B[i][j]==1) {cnt+=1;}}}for(int i = 0; i<n; ++i) {int x,y;x= A[i][0];y = A[i][1];for(int j = 0; j<n; ++j) {//计算当前树为左下角的小地图内的树总数int xLen = A[j][0] - x;int yLen = A[j][1] - y;if(xLen>=0&&xLen<=S&&yLen>=0&&yLen<=S) {A[i][2]+=1;temp[i][xLen][yLen] = 1;}}}int num = 0;for(int i = 0; i<n; ++i) {if(A[i][3]==-1||A[i][2]!=cnt) {continue;}bool flag = true;for(int j = 0; j<=S; ++j) {for(int k = 0; k<=S; ++k) {if(B[j][k]==1&&temp[i][j][k]!=B[j][k]) {flag = false;break;}}if(!flag) {break;}}if(flag) {num+=1;}}cout << num;return 0;
}

2.2、方法二(结构体储存)

思路:

构造一个树的结构题,其中储存以其为左下角构建的小地图,他在大地图中的坐标,以及它的地图是否越界,小地图中含有的树的数目,实现过程与方法一类似。

注意:边界判断

//第一次写80分,错在 x + S > L || y + S > L 多加了等于号

C++实现如下:

#include<iostream>
#include<vector>
using namespace std;
struct tree {int c[51][51];int view = 0;int cnt = 0;int x = 0;int y = 0;//int otherTree[1000];
};
vector<tree> t(1001);
//	tree t[1000];int main() {int n, L, S;int giftCnt = 0;int gift[51][51];cin >> n >> L >> S;for (int i = 0; i < n; ++i) {int x, y;cin >> x >> y;t[i].x = x;t[i].y = y;//如果当前树为左下角的藏宝图越界,将其标记为-1//第一次写80分,错在 x + S > L || y + S > L 多加了等于号 if (x + S > L || y + S > L ) {t[i].view = -1;}}for (int i = S; i >= 0; --i) {for (int j = 0; j <= S; ++j) {cin >> gift[i][j];if(gift[i][j]==1) {giftCnt+=1;}}}for (int i = 0; i < n; ++i) {int x, y;x = t[i].x;y = t[i].y;for (int j = 0; j < n; ++j) {int xLen = t[j].x - x;int yLen = t[j].y - y;if (xLen >= 0 && xLen <= S && yLen >= 0 && yLen <= S) {t[i].c[xLen][yLen] = 1;t[i].cnt+=1;}}}int num = 0;for (int i = 0; i < n; ++i) {bool flag = false;if(t[i].view==-1||t[i].cnt!=giftCnt) {continue;}for (int j = 0; j <= S; ++j) {for (int k = 0; k <= S; ++k) {if (t[i].c[j][k] != gift[j][k]) {flag = true;break;}}if (flag) {break;}}if (!flag) {if (t[i].view != -1)num++;}}//	for(int i = 0; i<n; ++i) {
//		cout << "第" << i << "个藏宝图" << endl;
//		cout << "该藏宝图拥有 " << t[i].cnt << " 棵树" << endl;
//		if(t[i].view==-1) {
//			cout << "他越界了 " << t[i].view << endl;
//		} else {
//			cout << "他没越界 " << t[i].view << endl;
//		}
//		for(int j = 0; j<=S; ++j) {
//			for(int k = 0; k<=S; ++k) {
//				cout << t[i].c[j][k] << ' ';
//			}
//			cout << endl;
//		}
//		cout << endl;
//	}
//	
//	cout << "小明的藏宝图" << endl;
//	for(int i = 0; i<=S; ++i) {
//		for(int j = 0; j<=S; ++j) {
//			cout<<gift[i][j] <<' ';
//
//		}
//		cout << endl;
//	}
//	cout << num;return 0;
}

2.3、方法三(map储存,int为key,map为value)

思路:

将大地图中的树的坐标存到c++的容器里,每次检查一棵树是否能作为有宝藏的地图时,就检查藏宝图内所有树的坐标是否都能在以这棵树为左下角的(S+1)*(S+1)区域内找到,如果可以便满足题目要求的条件。最后判断输出即可,是比较省时间省空间的做法。

同时,由于map是红黑树实现的,为有序的容器,由于此题并未对顺序做要求,所以可以使用由哈希表结构实现的unordered_map,进一步提高检索的效率。

unordered_map的头文件为#include<unordered_map>

C++实现如下:

#include<iostream>
#include<map>
#include<vector>
#include<unordered_map>
using namespace std;
//	使用的是map<int,map<int,int> > BigMp;int main() {int n,L,S;cin>>n>>L>>S;int x,y;unordered_map<int,int[4]> mp;unordered_map<int,int[2]> gift;
//	map<int,vector<int> > mp;
//	map<int,vector<int> > gift;
//	vector<int> v[L];unordered_map<int,map<int,int> > BigMp;	for(int i = 0; i<n; ++i) {cin >> x >> y;mp[i][0] = x;mp[i][1] = y;//储存当前树的横纵坐标在大地图中BigMp[x][y] = 1;if(x+S>L||y+S>L) {//表示以该树为左下角的地图越界mp[i][3] = -1;}}int giftNum = 0;for(int i = S; i>=0; --i) {for(int j = 0; j<=S; ++j) {int now = 0;cin>>now;if(now==1) {gift[giftNum][0] = i;gift[giftNum][1] = j;giftNum+=1;}}}for(int i = 0; i<n; ++i) {x = mp[i][0];y = mp[i][1];for(int j = 0; j<n; ++j) {int xLen = mp[j][0] - x;int yLen = mp[j][1] - y;if (xLen >= 0 && xLen <= S && yLen >= 0 && yLen <= S) {mp[i][2]+=1;}}}int num = 0;//遍历每一棵树for(int i = 0; i<n; ++i) {x = mp[i][0];y = mp[i][1];if(mp[i][3]==-1||mp[i][2]!=giftNum) {//当前树构成的小地图越界,或者小地图内含有的树的数量与藏宝图内的不符continue;}int flag = true;//遍历藏宝图中的每一棵树for(int j = 0; j<giftNum; ++j) {int gX = gift[j][0];int gY = gift[j][1];if( BigMp[x+gX][y+gY]!=1) {flag = false;break;}}if(flag) {num+=1;}}cout << num ;return 0;
}

2.4、方法四(map储存,pair为key,int为value)

思路:

与上一方法相同,只是容器的使用存在小小的区别

C++实现如下:

#include<iostream>
#include<map>
#include<vector>
using namespace std;
//	使用的是map<pair<int,int> ,int> BigMp;//可行 ,放里外都对 int main() {int n,L,S;cin>>n>>L>>S;int x,y;map<int,int[4]> mp;map<int,int[2]> gift;map<pair<int,int> ,int> BigMp;//可行 ,放里外都对 for(int i = 0; i<n; ++i) {cin >> x >> y;mp[i][0] = x;mp[i][1] = y;//储存当前树的横纵坐标在大地图中BigMp[make_pair(x,y)] = 1;if(x+S>L||y+S>L) {//表示以该树为左下角的地图越界mp[i][3] = -1;}}int giftNum = 0;for(int i = S; i>=0; --i) {for(int j = 0; j<=S; ++j) {int now = 0;cin>>now;if(now==1) {gift[giftNum][0] = i;gift[giftNum][1] = j;giftNum+=1;}}}for(int i = 0; i<n; ++i) {x = mp[i][0];y = mp[i][1];for(int j = 0; j<n; ++j) {int xLen = mp[j][0] - x;int yLen = mp[j][1] - y;if (xLen >= 0 && xLen <= S && yLen >= 0 && yLen <= S) {mp[i][2]+=1;}}}int num = 0;//遍历每一棵树for(int i = 0; i<n; ++i) {x = mp[i][0];y = mp[i][1];if(mp[i][3]==-1||mp[i][2]!=giftNum) {//当前树构成的小地图越界,或者小地图内含有的树的数量与藏宝图内的不符continue;}int flag = true;//遍历藏宝图中的每一棵树for(int j = 0; j<giftNum; ++j) {int gX = gift[j][0];int gY = gift[j][1];if( BigMp[make_pair(x+gX,y+gY)]!=1) {flag = false;break;}}if(flag) {num+=1;}}cout << num ;return 0;
}

三、遇到的问题

3.1、二维动态数组

使用该行代码 ,程序直接崩溃

vector<vector<int> > BigMp(1000000000,vector<int> (1000000000,0));

这段代码定义了一个名为 BigMp 的二维 vector,其中包含 10^18 个整数类型的元素,每个元素初始化为0。这里使用了 C++11 中引入的双大于号语法来表示嵌套的向量。
这段代码存在的问题是。它试图分配巨大的内存空间,超出了大部分机器的物理内存大小。由于每个 int 类型的变量通常占用4字节,因此将使用至少4000GB的内存,即使有处理这样多数据的计算机,也很可能会导致其他程序的崩溃或系统的不稳定。
所以不推荐在实际应用中使用这种方式来定义向量。如果需要创建一个大型二维数组,请考虑使用动态分配内存(例如使用 new)或将数据存储在磁盘上的文件中,以避免消耗过多的内存资源。

3.2、vector作为value

这种写法是很不推荐的,浪费空间 。

map<int,vector<int> > BigMp;//直接崩溃

3.3、结构体数组

这种结构体的写法,只能在main函数外部定义,因为其需要初始化。

tree t[1000];

建议使用下面这种实现方法。

vector<tree> t(1001);

相关文章:

CCF-202206-2-寻宝!大冒险!

目录 题目背景 问题描述 一、思路&#xff1a; 二、实现方法&#xff08;C&#xff09; 2.1、方法一&#xff08;int储存&#xff09; 思路&#xff1a; C实现如下&#xff1a; 2.2、方法二&#xff08;结构体储存&#xff09; 思路&#xff1a; 注意&#xff1a;边界…...

二叉搜索树中的众数

1题目 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&…...

认识JSP

什么是JSP? JSP&#xff08;Java Server Pages&#xff09;是一种类似于HTML的标记语言&#xff0c;用于创建动态Web页面。与HTML不同的是&#xff0c;JSP页面中可以嵌入Java代码&#xff0c;由Web服务器在动态页面中生成HTML代码&#xff0c;从而实现Web应用程序的前端交互效…...

MySQL数据管理

一、MySQL数据库管理 1、库和表 行&#xff08;记录&#xff09;&#xff1a;用来描述一个对象的信息 列&#xff08;字段&#xff09;&#xff1a;用来描述对象的一个属性 2、常用的数据类型 int &#xff1a;整型 float &#xff1a;单精度浮点 4字节32位 double &…...

第十九章 Unity 其他 API

本节介绍一些其他经常使用的Unity类。首先&#xff0c;我们回顾一下Vector3向量类&#xff0c;它既可以表示方向&#xff0c;也可以表示大小。它在游戏中可以用来表示角色的位置&#xff0c;物体的移动/旋转&#xff0c;设置两个游戏对象之间的距离。在我们之前的课程中&#x…...

sha256算法详解,用C语言模拟sha256算法

SHA-256是一种加密算法,它可以将任意长度的数据块计算出一个固定长度的输出值,通常是256位。SHA-256具有以下特点: 1. 固定输出长度:SHA-256的输出长度为256位,不受输入数据的长度限制。 2. 不可逆性:SHA-256采用单向哈希函数,即无法从输出值反向推出输入数据。 3. 抗…...

前端技术未来发展展望

前端技术在未来的发展中将继续保持快速、变化多样和创新性强的趋势。以下是我认为前端技术未来发展的几个方向&#xff1a; 框架和库的演进&#xff1a;框架和库的更新换代将继续加速。React、Vue、Angular等主流框架的更新周期将会缩短&#xff0c;同时各自的生态系统也将更加…...

第四十六天|dp

今天的题还是完全背包的题 139. Word Break 这道题其实用deque也能做,但是需要cache去记录之前尝试过的值,.相对简单的办法就是用完全背包了 这道题worddict就是物品.我们的dp[i]代表到i为止是不是能满足题意分成segmentation 处置化全为false,但是dp[0]True.这是因为为0时…...

汇编语言-复习自用

本文用于自我复习汇编语言&#xff0c;参考b站一位老师的讲解整理而成&#xff0c;感谢老师的无私付出视频链接链接 文章目录 1.第一章1.1计算机组成1.2读取1.3 寄存器及数据存储1.4 mov和and指令1.5 确定物理地址1.6 内存分段表示法1.7debug使用1.8CS:IP1.9jmp指令改变csip1.1…...

Android moneky自动点击应用设想

近期又有人发错私密消息到群聊天里&#xff0c;造成巨大反应的事件&#xff0c;可谓是一失手成大恨&#xff0c;名利受损。 而如果手机里安装一个monkey自动点击程序&#xff0c;没事的时候&#xff0c;跑跑monkey&#xff0c;倒一杯茶&#xff0c;静静的看手机屏幕在那里点击&…...

16.基于主从博弈理论的共享储能与综合能源微网优化运行研究

说明书 MATLAB代码&#xff1a;基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词&#xff1a;主从博弈 共享储能 综合能源微网 优化调度 参考文档&#xff1a;《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现 仿真平台&#xff1a;MATLAB …...

使用 ESP32 设计智能手表第 2 部分 - 环境光和心率传感器

我们研究了如何为我们的智能手表项目制作一些有趣的表盘。在这一部分中,我们将研究如何将一些传感器连接到我们的智能手表,并将连接 BH1750 环境光传感器和 MAX30102 心率传感器。我们将分别研究这些模块中的每一个的接口。 先决条件——安装必要的库 本文下方提供的 GitHub …...

分布式事务 --- 理论基础、Seata架构、部署

一、分布式事务问题 1.1、本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2、分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&am…...

低代码开发重要工具:JVS列表页字段样式配置说明

列表页中&#xff0c;通常存在各种各样的样式控制&#xff0c;例如字段宽度需要可调、字段的颜色根据内容变化等&#xff0c;那么我们接下来介绍下字段的样式控制的内容以及对应的效果。 1、字段样式控制配置位置 进入列表页的 数据配置界面&#xff0c;每个字段可以有独立的配…...

explain结果字段分析

select_type simple&#xff1a;表示不需要union操作或者不包含子查询的简单select语句。有连接查询时&#xff0c;外层的查询为simple且只有一个。 primary&#xff1a;一个需要union操作或者含有子查询的select&#xff0c;位于最外层的单位查询的select_type即为primary且只…...

MySQL连接查询

MySQL连接查询 在多表联合查询时&#xff0c;为了减少查询的次数&#xff0c;使用连接查询可以一次查询多个相关联表的数据。 MySQL连接查询&#xff1a;分为内连接查询和外连接查询。 其中外连接查询又分成 left连接查询 和 right连接查询。 下午为两张数据库表&#xff0c;表…...

7. Docker——Dockerfile

本章讲解知识点 DockerfileDockerfile 常用命令Dockerfile 综合示例Docker Compose当我们理解了镜像的基本原理后,我们就可以开始 Dockerfile 的学习了。 1. Dockerfile Dockerfile 是用于构建 Docker 镜像的脚本。它包含一组指令,按顺序执行以创建 Docker 镜像,从而使其可…...

Input事件在应用中的传递(一)

Input事件在应用中的传递(一) hongxi.zhu 2023-4-25 前面我们已经梳理了input事件在native层的传递&#xff0c;这一篇我们接着探索input事件在应用中的传递与处理&#xff0c;我们将按键事件和触摸事件分开梳理&#xff0c;这一篇就只涉及按键事件。 一、事件的接收 从前面的…...

我在VScode学Java(Java一维数组)

我的个人博客主页&#xff1a;如果\真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客&#xff1a;(我在Vscode学Java) 我在VScode学Java(Java一维数组&#xff09; Java 一维数组 声明数组&#xff1a;先声明&#xff0c;后使用 动态分配内…...

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT&#xff1f;这3个平替甚至比chatGPT更强 chatGPT&#xff0c;一款由OpenAI开发的新型AI聊天机器人&#xff0c;正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人&#xff0c;chatGPT能够理解自然语言并进行人机对话。与传统的…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...