蓝桥杯算法实战分享:C/C++ 题型解析与实战技巧
蓝桥杯全国软件和信息技术专业人才大赛,作为国内知名的算法竞赛之一,吸引了众多编程爱好者参与。在蓝桥杯的赛场上,C/C++ 因其高效性和灵活性,成为了众多选手的首选语言。本文将结合蓝桥杯的赛制特点、常见题型以及实战案例,分享一些 C/C++ 解题技巧与策略,帮助大家在比赛中取得更好的成绩。
一、蓝桥杯算法竞赛概述
蓝桥杯算法竞赛注重考察选手的算法设计能力、编程实现能力以及问题解决能力。比赛题目涵盖了数据结构、算法设计、动态规划、图论、数论等多个领域,要求选手在有限的时间内,快速分析问题、设计算法并编程实现。
二、C/C++ 解题基础
1. 语言特性
- 高效性:C/C++ 语言执行效率高,适合处理大规模数据和复杂算法。
- 灵活性:支持指针操作、内存管理,便于实现高级数据结构。
- 标准库:STL(Standard Template Library)提供了丰富的数据结构(如 vector、map、set)和算法(如 sort、lower_bound),可大大提高编程效率。
2. 编程规范
- 代码风格:保持代码整洁、易读,使用有意义的变量名和函数名。
- 注释习惯:在关键算法和复杂逻辑处添加注释,便于自己和他人理解。
- 错误处理:合理使用异常处理机制,确保程序的健壮性。
三、常见题型与解题技巧
1. 数据结构题
- 数组与字符串:掌握数组的遍历、排序、查找等基本操作;熟悉字符串的匹配、替换、分割等算法。
- 链表与树:理解链表和树的基本结构,掌握链表的插入、删除、反转等操作;熟悉二叉树的遍历、搜索、平衡等算法。
- 图论:掌握图的表示方法(邻接矩阵、邻接表);熟悉图的遍历(DFS、BFS)、最短路径(Dijkstra、Floyd)、最小生成树(Prim、Kruskal)等算法。
示例:Dijkstra 算法
给定一个有向加权图(以邻接表形式表示),以及一个起点,请计算并输出从起点到其它所有节点的最短距离。如果某个节点不可达,则输出 INF 表示无穷大。
#include <iostream>
#include <vector>
#include <queue>
#include <climits>using namespace std;// 定义无穷大的值
const int INF = INT_MAX;/*** 使用 Dijkstra 算法计算单源最短路径。* * @param n 节点的数量(从 0 到 n-1 编号)。* @param adj 邻接表表示的图,adj[u] 是一个 vector,存储从节点 u 出发的所有边,* 每条边用一个 pair 表示,pair 的 first 是目标节点 v,second 是边权重 w。* @param start 起始节点编号。* @return 一个 vector,存储从起始节点到每个节点的最短距离。如果某个节点不可达,则距离为 INF。*/
vector<int> dijkstra(int n, vector<vector<pair<int, int>>> &adj, int start) {// 初始化距离数组 dist,所有节点的距离设置为 INF,表示尚未访问vector<int> dist(n, INF);dist[start] = 0; // 起始节点到自身的距离为 0// 定义优先队列 pq,使用小顶堆存储 (当前距离, 当前节点),以实现每次取出最小距离的节点priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;pq.push({0, start}); // 将起始节点加入优先队列,距离为 0// 当优先队列不为空时,继续处理while (!pq.empty()) {// 取出当前距离最小的节点 uint u = pq.top().second;pq.pop();// 遍历节点 u 的所有邻接边for (auto &edge : adj[u]) {int v = edge.first; // 边的目标节点int w = edge.second; // 边的权重// 如果通过节点 u 到节点 v 的路径更短,则更新 dist[v]if (dist[u] + w < dist[v]) {dist[v] = dist[u] + w; // 更新最短距离pq.push({dist[v], v}); // 将更新后的节点 v 加入优先队列}}}return dist;
}int main() {// 示例图结构(邻接表表示)// 图中有 5 个节点,编号从 0 到 4int n = 5;vector<vector<pair<int, int>>> adj(n);// 添加边及其权重adj[0].push_back({1, 10});adj[0].push_back({3, 5});adj[1].push_back({2, 1});adj[1].push_back({3, 2});adj[2].push_back({4, 4});adj[3].push_back({1, 3});adj[3].push_back({2, 9});adj[3].push_back({4, 2});adj[4].push_back({0, 7});adj[4].push_back({2, 6});// 起点int start = 0;// 计算最短路径vector<int> dist = dijkstra(n, adj, start);// 输出结果cout << "从节点 " << start << " 出发到各个节点的最短距离:" << endl;for (int i = 0; i < n; ++i) {cout << "到节点 " << i << " 的最短距离是 ";if(dist[i] == INF) cout << "INF"; // 如果距离为 INF,表示不可达else cout << dist[i];cout << endl;}return 0;
}
示例:反转链表
给定一个单链表的头节点 head,请将其反转并返回反转后的链表头节点。例如:
- 输入:1 -> 2 -> 3 -> 4 -> 5
- 输出:5 -> 4 -> 3 -> 2 -> 1
#include <iostream>using namespace std;// 定义链表节点结构
struct ListNode {int val; // 节点值ListNode* next; // 指向下一个节点的指针ListNode(int x) : val(x), next(nullptr) {} // 构造函数
};/*** 反转链表的函数。* * @param head 单链表的头节点。* @return 反转后的链表头节点。*/
ListNode* reverseList(ListNode* head) {// 定义三个指针:prev、curr 和 nextListNode* prev = nullptr; // 初始时,前一个节点为空ListNode* curr = head; // 当前节点从头节点开始// 遍历链表,直到当前节点为空while (curr != nullptr) {ListNode* next = curr->next; // 保存当前节点的下一个节点curr->next = prev; // 将当前节点的 next 指向前一个节点,实现反转prev = curr; // 移动 prev 到当前节点curr = next; // 移动 curr 到下一个节点}// 循环结束后,prev 指向新的头节点(原链表的尾节点)return prev;
}// 辅助函数:打印链表
void printList(ListNode* head) {ListNode* curr = head;while (curr != nullptr) {cout << curr->val << " ";curr = curr->next;}cout << endl;
}int main() {// 创建一个示例链表:1 -> 2 -> 3 -> 4 -> 5ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(3);head->next->next->next = new ListNode(4);head->next->next->next->next = new ListNode(5);cout << "原链表:" << endl;printList(head);// 反转链表ListNode* reversedHead = reverseList(head);cout << "反转后的链表:" << endl;printList(reversedHead);return 0;
}
示例:Kruskal 算法求最小生成树
给定一个无向加权图,请使用 Kruskal 算法找到其最小生成树(MST)。如果图不连通,则返回森林的最小生成树。例如:
- 输入:图的边列表 edges = [[0, 1, 10], [0, 2, 6], [0, 3, 5], [1, 3, 15], [2, 3, 4]],节点数 n = 4
- 输出:最小生成树的边集合及其总权重。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 定义边的结构体
struct Edge {int u; // 边的一个端点int v; // 边的另一个端点int weight; // 边的权重
};// 并查集(Union-Find)数据结构,用于检测环
class UnionFind {
private:vector<int> parent; // 每个节点的父节点vector<int> rank; // 树的高度(秩)public:// 构造函数,初始化并查集UnionFind(int n) {parent.resize(n);rank.resize(n, 0);for (int i = 0; i < n; ++i) {parent[i] = i; // 初始时每个节点的父节点是自身}}// 查找操作,带路径压缩int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]); // 路径压缩}return parent[x];}// 合并操作,按秩合并void unite(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {if (rank[rootX] > rank[rootY]) {parent[rootY] = rootX;} else if (rank[rootX] < rank[rootY]) {parent[rootX] = rootY;} else {parent[rootY] = rootX;rank[rootX]++;}}}
};/*** 使用 Kruskal 算法求最小生成树。* * @param n 节点的数量(从 0 到 n-1 编号)。* @param edges 图的边列表,每条边表示为 (u, v, weight)。* @return 最小生成树的边集合及其总权重。*/
pair<vector<Edge>, int> kruskal(int n, vector<Edge> &edges) {// 将边按权重从小到大排序sort(edges.begin(), edges.end(), [](const Edge &a, const Edge &b) {return a.weight < b.weight;});UnionFind uf(n); // 初始化并查集vector<Edge> mst; // 存储最小生成树的边int totalWeight = 0; // 最小生成树的总权重// 遍历所有边for (const auto &edge : edges) {int u = edge.u;int v = edge.v;int weight = edge.weight;// 如果 u 和 v 不在同一个集合中,则添加这条边到 MST 中if (uf.find(u) != uf.find(v)) {uf.unite(u, v); // 合并两个集合mst.push_back(edge); // 将边加入最小生成树totalWeight += weight; // 累加权重}}return {mst, totalWeight};
}int main() {// 图的节点数和边列表int n = 4;vector<Edge> edges = {{0, 1, 10}, {0, 2, 6}, {0, 3, 5},{1, 3, 15}, {2, 3, 4}};// 使用 Kruskal 算法求最小生成树pair<vector<Edge>, int> result = kruskal(n, edges);vector<Edge> mst = result.first;int totalWeight = result.second;// 输出结果cout << "最小生成树的边:" << endl;for (const auto &edge : mst) {cout << edge.u << " - " << edge.v << " (权重: " << edge.weight << ")" << endl;}cout << "最小生成树的总权重: " << totalWeight << endl;return 0;
}
2. 算法设计题
- 动态规划:理解动态规划的基本思想,掌握状态定义、状态转移方程的设计方法。
- 贪心算法:学会分析问题的贪心性质,设计贪心策略。
- 回溯与搜索:掌握回溯算法的基本框架,学会剪枝优化。
示例:背包问题
给定一个容量为 W 的背包和 n 个物品,每个物品有一个重量 w[i] 和一个价值 v[i]。要求从这些物品中选择一些装入背包,在不超过背包容量的前提下,使得背包中的物品总价值最大。
此外,增加以下限制条件:
- 如果可以选择的物品数量超过 k 件,则必须使用回溯算法枚举所有可能的选择。
- 如果物品数量较少(小于等于 k),则使用动态规划解决。
- 使用贪心算法给出一种近似解,并与动态规划或回溯的结果进行比较。
算法设计:
- 动态规划(物品数 ≤ k):
- 状态定义:
dp[i][j]
表示前i
个物品在容量为j
的情况下能获得的最大价值。 - 状态转移方程:
- 不选第
i
个物品:dp[i][j] = dp[i-1][j]
- 选第
i
个物品:dp[i][j] = dp[i-1][j-w[i]] + v[i]
(前提是j >= w[i]
) - 最终状态:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
- 不选第
- 状态定义:
-
贪心算法:
- 按照单位价值(
v[i]/w[i]
)对物品排序,优先选择单位价值高的物品,直到背包装满。
- 按照单位价值(
-
回溯与搜索(物品数 > k):
- 使用回溯算法枚举所有可能的选择。
- 剪枝优化:如果当前选择的物品总重量已经超过背包容量,则直接返回。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 物品结构体
struct Item {int weight; // 物品重量int value; // 物品价值
};// 动态规划求解
int knapsackDP(int W, const vector<Item> &items) {int n = items.size();vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));for (int i = 1; i <= n; ++i) {for (int j = 0; j <= W; ++j) {dp[i][j] = dp[i - 1][j]; // 不选第 i 个物品if (j >= items[i - 1].weight) { // 选第 i 个物品dp[i][j] = max(dp[i][j], dp[i - 1][j - items[i - 1].weight] + items[i - 1].value);}}}return dp[n][W];
}// 贪心算法求解
int knapsackGreedy(int W, const vector<Item> &items) {vector<pair<double, int>> unitValue(items.size()); // 单位价值和索引for (int i = 0; i < items.size(); ++i) {unitValue[i] = {static_cast<double>(items[i].value) / items[i].weight, i};}sort(unitValue.rbegin(), unitValue.rend()); // 按单位价值降序排序int totalValue = 0;int remainingWeight = W;for (const auto &[_, idx] : unitValue) {if (remainingWeight >= items[idx].weight) {totalValue += items[idx].value;remainingWeight -= items[idx].weight;}}return totalValue;
}// 回溯算法求解
void backtrack(int idx, int currentWeight, int currentValue, int W, const vector<Item> &items, int &maxValue) {if (currentWeight > W) return; // 剪枝:超出背包容量if (idx == items.size()) {maxValue = max(maxValue, currentValue); // 更新最大值return;}// 不选当前物品backtrack(idx + 1, currentWeight, currentValue, W, items, maxValue);// 选当前物品if (currentWeight + items[idx].weight <= W) {backtrack(idx + 1, currentWeight + items[idx].weight, currentValue + items[idx].value, W, items, maxValue);}
}int knapsackBacktrack(int W, const vector<Item> &items) {int maxValue = 0;backtrack(0, 0, 0, W, items, maxValue);return maxValue;
}int main() {// 输入数据int W = 50; // 背包容量vector<Item> items = {{10, 60}, {20, 100}, {30, 120}}; // 物品列表int k = 2; // 动态规划与回溯的分界点// 动态规划求解if (items.size() <= k) {cout << "动态规划结果: " << knapsackDP(W, items) << endl;} else {// 回溯算法求解cout << "回溯算法结果: " << knapsackBacktrack(W, items) << endl;}// 贪心算法求解cout << "贪心算法结果: " << knapsackGreedy(W, items) << endl;return 0;
}
3. 数学题
- 数论:掌握素数判断、最大公约数、最小公倍数等算法。
- 组合数学:熟悉排列组合、二项式定理等知识点。
- 概率统计:理解基本概率模型,掌握期望、方差等统计量的计算。
示例:质因数分解与组合计数
给定一个正整数 n
,请完成以下任务:
- 将
n
进行质因数分解,并输出其所有质因数及其对应的指数。 - 计算从
1
到n
中所有数的排列数(即 n!n!)并输出结果。 - 如果 n!n! 的值过大,计算 n!mod 109+7n!mod109+7。
例如:
- 输入:
n = 6
- 输出:
- 质因数分解:
6 = 2^1 * 3^1
- 排列数:
6! = 720
- 模运算结果:
720 % (10^9+7) = 720
- 质因数分解:
#include <iostream>
#include <vector>
using namespace std;// 定义模数
const int MOD = 1e9 + 7;// 质因数分解函数
vector<pair<int, int>> primeFactorization(int n) {vector<pair<int, int>> factors; // 存储质因数及其指数for (int i = 2; i * i <= n; ++i) {if (n % i == 0) { // i 是 n 的因子int count = 0;while (n % i == 0) {n /= i;count++;}factors.emplace_back(i, count); // 添加质因数及其指数}}if (n > 1) { // 剩下的 n 是一个质数factors.emplace_back(n, 1);}return factors;
}// 阶乘计算函数(带模运算)
long long factorialMod(int n, int mod) {long long result = 1;for (int i = 1; i <= n; ++i) {result = (result * i) % mod; // 每一步取模}return result;
}int main() {// 输入数据int n;cout << "请输入一个正整数 n: ";cin >> n;// 1. 质因数分解vector<pair<int, int>> factors = primeFactorization(n);cout << "质因数分解结果: " << n << " = ";for (size_t i = 0; i < factors.size(); ++i) {cout << factors[i].first << "^" << factors[i].second;if (i != factors.size() - 1) cout << " * ";}cout << endl;// 2. 计算阶乘 n!long long factorial = 1;for (int i = 1; i <= n; ++i) {factorial *= i;}cout << "n! 的值: " << factorial << endl;// 3. 计算 n! % (10^9+7)long long factorialModResult = factorialMod(n, MOD);cout << "n! % (10^9+7): " << factorialModResult << endl;return 0;
}
四、实战策略与技巧
1. 时间管理
- 合理安排时间,优先解决易得分的题目。
- 对于难题,先尝试部分分,再逐步攻克。
2. 代码调试
- 使用调试工具(如 gdb)进行逐步调试。
- 编写测试用例,验证代码的正确性。
3. 代码优化
- 减少不必要的计算,提高算法效率。
- 使用合适的数据结构,降低时间复杂度。
相关文章:
蓝桥杯算法实战分享:C/C++ 题型解析与实战技巧
蓝桥杯全国软件和信息技术专业人才大赛,作为国内知名的算法竞赛之一,吸引了众多编程爱好者参与。在蓝桥杯的赛场上,C/C 因其高效性和灵活性,成为了众多选手的首选语言。本文将结合蓝桥杯的赛制特点、常见题型以及实战案例…...
IDEA下载kotlin-compiler-embeddable特别慢
问题: 在创建IDEA插件项目时发现 下载kotlin-compiler-embeddable特别慢,然后等待几十分钟然后失败 可以先用控制台显示正在下载的链接,下载好 jar包: https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-compi…...
武装Burp Suite工具:HaE 分析辅助类_插件.【高亮标记和信息提取利器】
武装 Burp Suite 插件:HaE 分析辅助类. HaE 分析辅助类是一款基于正则表达式的高效数据提取与标记工具,常用于安全测试、日志分析等场景,通过预定义规则快速定位敏感信息(如API密钥、URL参数),提升…...
使用Nacos 打造微服务配置中心
一、背景介绍 Nacos 作为服务注册中心的使用方式,同时 Nacos 还可以作为服务配置中心,用于集中式维护各个业务微服务的配置资源。 作为服务配置中心的交互流程图如下。 这样设计的目的,有一个明显的好处就是:有利于对各个微服务…...
C++——多态、抽象类和接口
目录 多态的基本概念 如何实现多态 在C中,派生类对象可以被当作基类对象使用 编程示例 关键概念总结 抽象类 一、抽象类的定义 基本语法 二、抽象类的核心特性 1. 不能直接实例化 2. 派生类必须实现所有纯虚函数才能成为具体类 3. 可以包含普通成员函数和…...
模拟实现strncat、qsort、atoi
目录 前言 一、模拟实现strncat 参数 代码演示: 二、模拟实现qsort 参数 代码演示: 前言 本文主要是对strncat,qsort,atoi的模拟实现 一、模拟实现strncat C 库函数 char *strncat(char *dest, const char *src, size_t n…...
记录学习的第三十天
今天终于又开始写博客了。 还是滑动窗口问题,这段时间不出意外都是这了 上面的思路是我自己做的,但是不知道为什么不行,有没有大佬能指点一下我。 接下来这道题是进阶的。不过我之前的基础都做的很艰难,道阻且长啊。...
图像预处理-直方图均衡化
一.什么是直方图 反映图像像素分布的统计图,横坐标就是图像像素的取值,纵坐标是该像素的个数。 二.绘制直方图 histcv2.calcHist(images, channels, mask, histSize, ranges) - images:输入图像列表(必须用[ ]包裹)&a…...
应用案例|兵器重工:某体系需求视图模型开发
某体系需求视图模型开发 一、项目背景 本项目为某体系的需求视图模型开发,其中体系设计建模过程可以分解为7大部分,即建模前期准备、全景视点模型正向设计、能力视点模型正向设计、作战视点模型正向设计、系统视点模型正向设计、体系模型反向追溯设计以…...
YOLOv8改进:ShapeIoU与InnerShapeIoU损失函数的理论与实践
文章目录 YOLOv8 损失函数概述ShapeIoU 与 InnerShapeIoU 损失介绍ShapeIoU 损失InnerShapeIoU 损失 ShapeIoU 和 InnerShapeIoU 损失函数的实现ShapeIoU 损失函数代码实现InnerShapeIoU 损失函数代码实现损失函数在 YOLOv8 中的应用 实验效果与分析ShapeIoU 和 InnerShapeIoU …...
用Go语言正则,如何爬取数据
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Java中实现单例模式的多种方法:原理、实践与优化
单例模式(Singleton Pattern)是设计模式中最简单且最常用的模式之一,旨在确保一个类只有一个实例,并提供全局访问点。在 Java 开发中,单例模式广泛应用于配置管理、日志记录、数据库连接池和线程池等场景。然而&#x…...
Pikachu靶场-RCE漏洞
1. RCE漏洞原理 核心问题:应用程序未对用户输入进行严格过滤,直接将输入内容拼接至系统命令、代码执行函数或反序列化过程中。常见触发场景:命令注入:用户输入被拼接到操作系统命令(如system()、exec())。代…...
OpenCv高阶(七)——图像拼接
目录 一、图像拼接的原理过程 1. 特征检测与描述(Feature Detection & Description) 2. 特征匹配(Feature Matching) 3. 图像配准(Image Registration) 4. 图像变换与投影(Warping&…...
电商系统用户需求报告(示例)
目录 电商系统用户需求报告 1. 引言 1.1 目的 1.2 范围 2. 用户角色与核心需求 2.1 消费者 2.2 商家 2.3 平台管理方 3. 非功能性需求 4. 业务流程 4.1 消费者购物流程 4.2 商家入驻流程…...
图像挖掘课程笔记-第一章:了解机器视觉
一、什么是图像挖掘(Image Mining)? 图像挖掘是一种从大量图像中自动提取有用信息、知识或模式的技术,它融合了图像处理、机器学习、数据库、人工智能、数据挖掘等多个领域的内容。 🧠 图像挖掘与图像处理的区别 图像…...
Spring集合注入Bean
Spring框架中实现Bean集合注入的详细方法 1. 基础自动注入方式1.1 使用Autowired注入List1.2 使用Autowired注入Map 2. 更精细的控制方式2.1 使用Qualifier进行筛选2.2 使用自定义注解筛选 3. Java配置类方式4. 排序注入的Bean集合4.1 使用Order注解4.2 实现Ordered接口 5. 条件…...
实验一 进程控制实验
一、实验目的 1、掌握进程的概念,理解进程和程序的区别。 2、认识和了解并发执行的实质。 3、学习使用系统调用fork()创建新的子进程方法,理解进程树的概念。 4、学习使用系统调用wait()或waitpid()实现父子进程同步。 5、学习使用getpid()和getppi…...
[预备知识]4. 概率基础
概率基础 本章节介绍深度学习中的概率基础知识,包括基本概念、概率分布和统计推断。 1. 概率基础 1.1 基本概念 随机变量:可以取不同值的变量,其值由随机试验的结果决定概率分布:描述随机变量取值的可能性分布条件概率&#x…...
第33周JavaSpringCloud微服务 电商进阶开发
一、课程介绍 1. 定时任务 课程主题 :Spring Cloud 电商进阶开发定时任务定义 :学习什么是定时任务。定时任务学习内容 :定时任务实现方法、cron 表达式。定时任务实践 :在 Spring 中使用 schedule 注解,定期关闭过期…...
基于cubeMX的hal库STM32实现硬件IIC通信控制OLED屏
1、通常的方法是使用软件模拟IIC来实现OLED屏的显示控制,这里用STM32单片机的硬件IIC来实现OLED屏的显示,主控芯片为STM32F103RCT6,正点原子mini开发板。 2、cubemx配置过程 (1)配置时钟和下载 (2&#x…...
游戏工作室为何要更换IP进行多开?工作室使用代理IP要注意什么?
在当今的游戏产业中,游戏工作室为了提升效率、规避风险或突破平台限制,常常需要通过更换IP进行多开操作。这一现象背后涉及技术、商业规则和网络安全等多重因素,而代理IP的选择与使用也成为工作室运营中的关键环节。以下是关于游戏工作室为何…...
postgreSQL 如何使用 dblink
SELECT b.id, flow_name, user_id,u.name FROM bpm_form_info b JOIN vrms_user u on b.user_idu.id dblink SELECT b.id, flow_name, user_id,u.name FROM bpm_form_info b – vrms_user u on b.user_idu.id JOIN dblink( ‘dbnameuser_db userpostgres passwordWs199612’,…...
121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息
🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…...
复盘20250422
深度分析及个股推荐 1. 行业前景与个股逻辑梳理 从提供的股票信息来看,主要涉及以下行业:合成尼古丁(电子烟)、化工、跨境支付、跨境电商、农药、食品饮料、光刻机、电子商务、造纸等。需结合行业景气度、政策支持、公司核心竞争…...
MQ底层原理
RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件(Message Broker),实现了 Advanced Message Queuing Protocol(AMQP)协议,可以帮助不同应⽤程序之间进⾏通信和数据交换。RabbitMQ 是由 E…...
30分钟编写十大排序算法完成
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;//排序算法 public class test_04_22 {public static void swap(int[] nums, int i, int j){int temp nums[i];nums[i] nums[j];nums[j] temp;}//冒泡排序-稳定…...
为什么家电主板采用GND走线而不是整面铺GND铜
不管什么接地方式,本质是为了使得电流的回流路径最短。只要电流的回流路径最短,怎么都可以! 如下图的芯片的一个信号的回流路径,是一个很糟糕的接地!!!!!!&a…...
NVIDIA 自动驾驶技术见解
前言 参与 NVIDIA自动驾驶开发者实验室 活动,以及解读了 NVIDIA 安全报告 自动驾驶 白皮书,本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞,重塑更安全、高效、包容的交通生态。在这一领域,NVI…...
真我推出首款 AI 翻译耳机,支持 32 种语言翻译
2025 年 4 月 22 日,真我手机官微宣布,其首款 AI 翻译耳机 Buds Air7 Pro 将于 4 月 23 日 16 时正式上市1。这款耳机接入了讯飞星火认知大模型 4.0 Ultra,支持中文与 32 种语言面对面翻译,以及同声传译功能。 除了 AI 翻译功能&a…...
如何简化复杂流程提升执行效率
简化复杂流程、提升执行效率的关键在于:聚焦核心目标、减少冗余环节、推动系统自动化、赋能一线决策、流程分级设计。其中,聚焦核心目标 是流程优化的第一步。流程不该为了“流程而流程”,而应服务于业务目标。Gartner在《数字化运营报告》中…...
动态规划算法:完全背包类问题
前言 现在我们考虑下面的问题: (1)小明有一个背包,背包容积为v,有m种物品,其中第i种物品的价值为val[i],体积为t[i],每样物品有无限个,请问背包内物品总价值最大为多少?…...
数据存储方式补码原码反码
1. 关于数据存储(补码、原码、反码) 有符号类型(Signed Types) 存储方式:现代计算机普遍采用 补码(Two’s Complement) 存储有符号整数。 原码:最高位为符号位(0正&…...
【AAudio】A2dp sink创建音频轨道的源码流程分析
一、AAudio概述 AAudio 是 Android 8.0(API 级别 26)引入的 C/C++ 原生音频 API,专为需要低延迟、高性能音频处理的应用设计,尤其适用于实时音频应用(如音频合成器、音乐制作工具、游戏音效等)。 1.1 主要特点 低延迟:通过减少音频数据在内核与用户空间之间的拷贝,直…...
黑马点评之Feed流技术实现关注推送与滚动分页查询
Feed流 关注推送也叫做Feed流,直译为“投喂”。为用户持续的提供“沉浸式体验”,通过无限下拉刷新获取新的信息。 Feed流(信息流)是一种常见的内容分发形式,通过动态更新的内容列表向用户展示个性化或实时信息。典型应…...
vue3+canvas裁剪框样式【前端】
目录 canvas绘制裁剪框:拖拽改变框的大小:圆圈样式:方块样式: canvas绘制裁剪框: // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…...
Python 设计模式:模板模式
1. 什么是模板模式? 模板模式是一种行为设计模式,它定义了一个操作的算法的骨架,而将一些步骤延迟到子类中。模板模式允许子类在不改变算法结构的情况下,重新定义算法的某些特定步骤。 模板模式的核心思想是将算法的固定部分提取…...
usb2.0的硬件知识(一)
一、USB2.0的硬件知识 1.1 USB2.0速率 USB 2.0协议支持3种速率:低速(Low Speed,1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps);USB Hub、USB设备,也分为低速、全速、高速三种类型。 1.2 USB2.0硬件线序组成 U…...
LangGraph(二)——QuickStart样例中的第二步
目录 1. 添加依赖2. 官网QuickStart——第二步:用工具增强聊天机器人2.1 Tavily Search2.2 简单测试Tavily Search2.3 添加带工具的ChatBot node2.4 添加tool node2.5 添加条件边2.6 可视化StateGraph2.7 构建聊天循环 参考 1. 添加依赖 LangGraph(一)——QuickStar…...
机器学习第二篇 多变量线性回归
数据集:世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom,来预测幸福指数得分。 文件一:linear,…...
【MCP Node.js SDK 全栈进阶指南】中级篇(3):MCP高级资源设计
前言 在MCP TypeScript-SDK的初级篇中,我们介绍了资源开发的基础知识,包括静态资源与动态资源的创建、资源模板设计与参数提取,以及基本的资源列表与发现机制。随着应用规模的扩大和复杂性的提高,我们需要更加高级的资源设计方案来应对各种挑战。 本文作为中级篇的第三篇…...
PostgreSQL 常用日志
PostgreSQL 常用日志详解 PostgreSQL 提供了多种日志类型,用于监控数据库活动、排查问题和优化性能。以下是 PostgreSQL 中最常用的日志类型及其配置和使用方法。 一、主要日志类型 日志类型文件位置主要内容用途服务器日志postgresql-<日期>.log服务器运行…...
PostgreSQL认证培训推荐机构
首先来看一张2025年4月份db-engines上的数据库排行情况,前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server,排名第四的就是我们今天的主角 - PostgreSQL数据库,从这张图上可以看出,PostgreSQL数据库的上升超非常明显&#x…...
2025年NISP一级题库试题
NISP一级考试只考50道单选题,难度不算大,话不多说,直接上硬菜! 1、物理销毁的方式不包括() .消磁 B.焚化炉烧毀 C.反复覆写数据 D.机器硏磨粉碎 2、信息安全应该建立贯穿信息系统的整个生命周期…...
pip install pymysql报错
python安装pymysql报错解决 【现象】 很多时候会出现安装pip包报错的问题,看过很多网上教程以及ai都是如下说法: 镜像问题pip版本问题ssh证书问题网络问题… 在遇见这些情况时,上述的各种解决方法都一一实验过但最后都是ERROR。 【解决办…...
达梦官方管理工具 SQLark 更新--不仅支持达梦、Oracle、MySQL,还新增 PostgreSQL 数据库!
SQLark 是一款面向信创应用开发者的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,已支持达梦、Oracle、MySQL数据库;在最新的 V3.4 版本中,SQLark 新增了对 PostgreSQL 的支持,兼容 PostgreSQL…...
Windows 同步-互锁变量访问
互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行(完全或根本不执行)。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说,你最终不会只更新变量的一部分;所有位都以…...
前端学习笔记
文章目录 前端主要内容基于脚手架创建前端工程vue的基本使用axios 路由Vue-Router路由组成嵌套路由 状态管理 vuex心得 前端主要内容 HTML、CSS JavaScript axios Vue基础语法(router、vuex、typescript) Element UI 基于脚手架创建前端工程 node.js …...
2025-04-22| Docker: --privileged参数详解
在 Docker 中,--privileged 是一个运行容器时的标志,它赋予容器特权模式,大幅提升容器对宿主机资源的访问权限。以下是 --privileged 的作用和相关细节: 作用 完全访问宿主机的设备: 容器可以访问宿主机的所有设备&am…...
Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子
目录 概念 AOP 术语 1. 连接点(Jointpoint): 2. 切入点(Pointcut): 3. 通知(Advice): 4. 方面/切面(Aspect): 5. 引入ÿ…...