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

代码随想录二刷|图论2

图论

基础知识

1 无向图

(1)度:一个顶点连n条边就度为n

(2)权

加权无向图:有边长的无向图

(3)通道:两个顶点之间有一些边和点,并且没有重复的边

路:两个顶点之间有一些边和点,并且没有重复的边和点

(4)连通性

1)连通图:任意两点之间都有路相连

2)连通分量:极大连通子图

(连通子图,并且没有包含这个连通子图的连通图)

2 有向图

(1)度

入度:n条边指向顶点则入度为n

出度:从顶点发出n条边则出度为n

(2)权

加权有向图:有边长的无向图

(3)连通性

1)强连通:任意2个点可以相互到达。也就是任意两个点之间都有相互指向的有向路(任何一个点,都有到剩下所有点的有向路)

2)强连通分量:极大强连通子图

(强连通子图,并且没有包含这个强连通子图的强连通图)

3 图的构造

邻接表、邻接矩阵 或者用类

(1)邻接表

1)邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表

// 节点编号从1到n,所以申请 n+1 这么大的数组
vector<list<int>> graph(n + 1); // 邻接表,list为C++里的链表
graph[1].push_back(3)  表示5--->3

img

  • 节点1 指向 节点3 和 节点5
  • 节点2 指向 节点4、节点3、节点5
  • 节点3 指向 节点4
  • 节点4指向节点1

2)邻接表的优点:

  • 对于稀疏图的存储,只需要存储边,空间利用率高
  • 遍历节点连接情况相对容易

3)邻接表的缺点:

  • 检查任意两个节点间是否存在边,效率相对低,需要 O(V)时间,V表示某节点连接其他节点的数量。
  • 实现相对复杂,不易理解

(2)邻接矩阵

1)邻接矩阵 使用 二维数组 来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组

grid[i][j] = 6,表示 节点 i 指向 节点j ,边的权值为6

如果想表示无向图,即:grid[i][j] = 6grid[j][i] = 6,表示节点i 与 节点j相互连通,权值为6

2)邻接矩阵的优点:

  • 表达方式简单,易于理解
  • 检查任意两个顶点间是否存在边的操作非常快
  • 适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。

3)邻接矩阵的缺点:

  • 遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费

(3)类

4 图的遍历方式

  • 深度优先搜索(dfs)
  • 广度优先搜索(bfs)

深度优先搜索

1、dfs要点

(1)搜索方向,是认准一个方向搜,直到碰壁之后再换方向

(2)换方向是撤销原路径,回退一步,改为节点链接的下一个路径(回溯的过程)

2、dfs的举例

图二

假设默认路径

那么接下来考虑下一个方向,先回溯退回5,遍历5的下一步选择接下来就选择5—4

在节点4这里,先选择6,到达终点,再回溯退回4,遍历4的下一步选择,接下来就选择4–3

3、dfs代码(也就是回溯)

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表);  递归回溯,撤销处理结果}
}

4、深度优先搜索的三步走

(1)确定递归返回值和参数

(2)确定终止条件,以及终止条件处做什么

(3)遍历当前节点可以选择的下一个点(遍历递归树的一个层)

5、模板题:所有可达路径

题目描述

给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。

输入描述

第一行包含两个整数 N,M,表示图中拥有 N 个节点,M 条边

后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径

输出描述

输出所有的可达路径,路径中所有节点之间空格隔开,每条路径独占一行,存在多条路径,路径输出的顺序可任意。如果不存在任何一条路径,则输出 -1。

注意输出的序列中,最后一个节点后面没有空格! 例如正确的答案是 1 3 5,而不是 1 3 5 , 5后面没有空格!

#include <bits/stdc++.h>
#include <vector>
using namespace std;
vector<int> path;
vector<vector<int>> res;
void dfs(int point, int n, vector<vector<int>>& graph) {if (point == n) {res.push_back(path);return;}for (int i = 1; i < graph[point].size(); i++) {if (graph[point][i]) {path.push_back(i);dfs(i, n, graph);path.pop_back();}}
}
int main() {int n;int m;cin >> n >> m;vector<vector<int>> graph(n + 1, vector<int>(n + 1, 0));for (int i = 0; i < m; i++) {int start;int end;cin >> start >> end;graph[start][end] = 1;}path.push_back(1);dfs(1, n, graph);if (res.size() == 0) {cout << -1 ;return 0;}for (int i = 0; i < res.size(); i++) {for (int j = 0; j < res[i].size(); j++) {cout << res[i][j];if (j < res[i].size()-1)cout << " ";}if (i < res.size()-1)cout << "\n";}return 0;
}

广度优先搜索

1、特点

广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后再回溯

2、只要BFS只要搜到终点一定是一条最短路径

3、代码框架

(1)如何保存遍历到的点:

仅仅需要一个容器,能保存我们要遍历过的元素就行,用队列,用栈,用数组,都是可以的

这里选择用队列

(2)要点

1)用队列进行遍历,每次把队首拿出来,弹出,将队首可以走到的后面的点放进队尾,一直到队空

2)在入队的时候标记visit,因为如果在弹出的时候再标记就会导致一个点重复的加入队列

(3)举例

用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步

(例子、图和代码来自代码随想录)

图二

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
// grid 是地图,也就是一个二维数组
// visited标记访问过的节点,不要重复访问
// x,y 表示开始搜索节点的下标
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列que.push({x, y}); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点while(!que.empty()) { // 开始遍历队列里的元素pair<int ,int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + dir[i][0];int nexty = cury + dir[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty]) { // 如果节点没被访问过que.push({nextx, nexty});  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问}}}}

岛屿数量

题干

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。

后续 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述

输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。

输入示例

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例

3

思路:每次遇到第一个没有访问过的陆地,就给结果+1,然后把与这个陆地相连的陆地全都标记为isited

无论是dfs还是bfs,都是为了找到与这个陆地相连的陆地

1、深度优先搜索

(1)版本1

没有明确的终止条件,用for循环内的判断条件排除

include <iostream>
#include <vector>
using namespace std;int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的visited[nextx][nexty] = true;dfs(grid, visited, nextx, nexty);}}
}int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<bool>> visited(n, vector<bool>(m, false));int result = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) {visited[i][j] = true;result++; // 遇到没访问过的陆地,+1dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true}}}cout << result << endl;
}
(2)版本2

1)无返回值,参数包括图、visited、当前坐标,n和m

然后标记当前点visited[i][j] = 1

2)终止条件:

再判断一个点之前,先判断他是不是要考虑的

水域–不考虑

已经访问—不考虑

越界—不考虑

3)从当前点(i,j)出发,遍历上下左右,因为一开始判断有效性,所以所有点都递归

#include <bits/stdc++.h>
#include <vector>
using namespace std;int directioni[4] = {0, 1, 0, -1};
int directionj[4] = {1, 0, -1, 0};
void dfs(vector<vector<int>> &visited, vector<vector<int>> &graph, int i, int j,int n, int m) {if (i < 0 || i >= n || j < 0 || j >= m)return;if (visited[i][j])return;if (graph[i][j] == 0)return;visited[i][j] = 1;for (int k = 0; k < 4; k++) {int x = directioni[k] + i;int y = directionj[k] + j;dfs(visited, graph, x, y, n, m);}
}int main() {int n;int m;int sum = 0;cin>>n>>m;vector<vector<int>> graph(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> graph[i][j];}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && graph[i][j]) {sum++;dfs(visited, graph, i, j, n, m);}}}cout << sum;return 0;
}

2、广度优先搜索

(1)把当前找到的第一次出现的陆地作为起点,bfs遍历与他相邻的陆地

每次把队首拿出来,弹出,队首可以走到的后面的点如果是没有访问过的陆地就放进队尾并且标记,一直到队空

(2)在入队的时候标记visit,因为如果在弹出的时候再标记就会导致一个点重复的加入队列

#include <bits/stdc++.h>
#include <vector>
using namespace std;int n;
int m;
int directioni[4] = {0, 1, 0, -1};
int directionj[4] = {1, 0, -1, 0};
void bfs(vector<vector<int>> graph, vector<vector<int>> &visited, int startx,int starty) {queue<pair<int, int>> q;q.push(make_pair(startx, starty));visited[startx][starty] = 1;while (!q.empty()) {pair<int, int> now = q.front();q.pop();for (int i = 0; i < 4; i++) {int x = now.first + directioni[i];int y = now.second + directionj[i];if (x < 0 || x >= n || y < 0 || y >= m)continue;if (!visited[x][y] && graph[x][y]) {q.push(make_pair(x, y));visited[x][y] = 1;}}}
}
int main() {int sum = 0;cin >> n >> m;vector<vector<int>> graph(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> graph[i][j];}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && graph[i][j]) {sum++;bfs(graph, visited, i, j);}}}cout << sum;return 0;
}

岛屿的最大面积

题干

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。

输出描述

输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。

输入示例

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例

4

思路

每次遇到第一个没有访问过的陆地,就给结果+1,然后把与这个陆地相连的陆地全都标记为visited并且面积+1

遇到第一个没有访问过的陆地就是遇到新的岛屿

无论是dfs还是bfs,都是为了找到与这个陆地相连的陆地,并且记录这个岛屿的面积

dfs
#include <bits/stdc++.h>
#include <vector>
using namespace std;int directioni[4] = {0, 1, 0, -1};
int directionj[4] = {1, 0, -1, 0};
void dfs(vector<vector<int>> &visited, vector<vector<int>> &graph, int i, int j,int n, int m, int &area) {if (i < 0 || i >= n || j < 0 || j >= m)return;if (visited[i][j])return;if (graph[i][j] == 0)return;visited[i][j] = 1;area++;for (int k = 0; k < 4; k++) {int x = directioni[k] + i;int y = directionj[k] + j;dfs(visited, graph, x, y, n, m,area);}
}int main() {int n;int m;cin >> n >> m;vector<vector<int>> graph(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> graph[i][j];}}int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && graph[i][j]) {int area = 0;dfs(visited, graph, i, j, n, m, area);res = max(res, area);}}}cout << res;return 0;
}
bfs
#include <bits/stdc++.h>
#include <vector>
using namespace std;int n;
int m;
int directioni[4] = {0, 1, 0, -1};
int directionj[4] = {1, 0, -1, 0};
int bfs(vector<vector<int>> graph, vector<vector<int>> &visited, int startx,int starty) {queue<pair<int, int>> q;q.push(make_pair(startx, starty));int area = 1;visited[startx][starty] = 1;while (!q.empty()) {pair<int, int> now = q.front();q.pop();for (int i = 0; i < 4; i++) {int x = now.first + directioni[i];int y = now.second + directionj[i];if (x < 0 || x >= n || y < 0 || y >= m)continue;if (!visited[x][y] && graph[x][y]) {q.push(make_pair(x, y));visited[x][y] = 1;area++;}}}return area;
}
int main() {int res = 0;cin >> n >> m;vector<vector<int>> graph(n, vector<int>(m, 0));vector<vector<int>> visited(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> graph[i][j];}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && graph[i][j]) {int t = bfs(graph, visited, i, j);res = max(res, t);}}}cout << res;return 0;
}

相关文章:

代码随想录二刷|图论2

图论 基础知识 1 无向图 &#xff08;1&#xff09;度&#xff1a;一个顶点连n条边就度为n &#xff08;2&#xff09;权 加权无向图&#xff1a;有边长的无向图 &#xff08;3&#xff09;通道&#xff1a;两个顶点之间有一些边和点&#xff0c;并且没有重复的边 路&am…...

毕业项目推荐:基于yolov8/yolov5/yolo11的暴力行为检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

服务器CPU微架构

1、微架构图 前端&#xff1a;预解码、解码、分支预测、L1指令缓存、指令TLB缓存 后端&#xff1a;顺序重排缓存器ROB处理依赖&#xff0c;调度器送到执行引擎 执行引擎&#xff1a;8路超标量&#xff0c;每一路可以进行独立的微操作处理 Port0、1、5、6支持整数、浮点数的加…...

用本地浏览器打开服务器上使用的Tensorboard

文章目录 前言一、Tensorboard的安装二、使用步骤1.服务器上的设置2.在本地打开 总结 前言 最近有使用服务器上的Tensorboard的需求&#xff0c;踩了几个雷&#xff0c;现已在搜索和帮助下解决&#xff0c;总结于此。 一、Tensorboard的安装 pip install tensorboard2.12.0注…...

Nginx或Tengine服务器配置SSL证书

本文将全面介绍如何在Nginx或Tengine服务器配置SSL证书&#xff0c;具体包括下载和上传证书文件&#xff0c;在Nginx上配置证书文件、证书链和证书密钥等参数&#xff0c;以及安装证书后结果的验证。成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器…...

【基础4】插入排序

核心思想 插入排序是一种基于元素比较的原地排序算法&#xff0c;其核心思想是将数组分为“已排序”和“未排序”两部分&#xff0c;逐个将未排序元素插入到已排序部分的正确位置。 例如扑克牌在理牌的时候&#xff0c;一般会将大小王、2、A、花牌等按大小顺序插入到左边&…...

2安卓开发的主要语言

1. Kotlin&#xff08;官方首选语言&#xff09; 定位&#xff1a;Google 官方推荐的首选 Android 开发语言&#xff08;2019 年起&#xff09;。 优势&#xff1a; 简洁高效&#xff1a;语法糖减少样板代码&#xff08;如 data class 自动生成 equals()/hashCode()&#xff0…...

Python练习(握手问题,进制转换,日期问题,位运算,求和)

一. 握手问题 代码实现 ans0for i in range(1,51):for j in range(i1,51):if i<7 and j<7:continueelse:ans 1print(ans) 这道题可以看成是50个人都握了手减去7个人没握手的次数 答案&#xff1a;1204 二.将十进制整数拆解 2.1门牌制作 代码实现 ans0for i in ra…...

vtk 3D坐标标尺应用 3D 刻度尺

2d刻度尺 : vtk 2D 刻度尺 2D 比例尺-CSDN博客 简介&#xff1a; 3D 刻度尺&#xff0c;也是常用功能&#xff0c;功能强大 3D 刻度尺 CubeAxesActor vtkCubeAxes调整坐标轴的刻度、原点和显示效果&#xff0c;包括关闭小标尺、固定坐标轴原点&#xff0c;以及设置FlyMode模…...

蓝桥杯每日一题:第一周周四哞叫时间

蓝桥杯每日一题&#xff1a;第一周周四哞叫时间 疑惑&#xff1a;如何把复杂度控制在Q&#xff08;n&#xff09;&#xff0c;怎么枚举a和b&#xff0c;longlong的形式又该怎么输入&#xff08;考虑用string&#xff09; 思路&#xff1a;枚举倒数第二个b前面有多少个a 这是一…...

DeepSeek本地接口调用(Ollama)

前言 上篇博文&#xff0c;我们通过Ollama搭建了本地的DeepSeek模型&#xff0c;本文主要是方便开发人员&#xff0c;如何通过代码或工具&#xff0c;通过API接口调用本地deepSeek模型 前文&#xff1a;DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注&#xff1a;本文不仅…...

自由学习记录(41)

代理服务器的核心功能是在客户端&#xff08;用户设备&#xff09;和目标服务器&#xff08;网站/资源服务器&#xff09;之间充当“中介”&#xff0c;具体过程如下&#xff1a; 代理服务器的工作流程 当客户端希望访问某个网站&#xff08;比如 example.com&#xff09;时&…...

【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码的…...

大模型如何协助知识图谱进行实体关系之间的分析

大模型在知识图谱中协助进行实体关系分析的方式主要体现在以下几个方面&#xff1a; 增强数据标注与知识抽取 大模型通过强大的自然语言处理能力&#xff0c;能够高效地对原始数据进行实体、关系和事件的标注&#xff0c;从而提高数据处理的效率和准确性。例如&#xff0c;Deep…...

推荐几款优秀的PDF转电子画册的软件

当然可以&#xff01;以下是几款优秀的PDF转电子画册的软件推荐&#xff0c;内容简洁易懂&#xff0c;这些软件都具有易用性和互动性&#xff0c;适合不同需求的用户使用。​ ❶ FLBOOK&#xff5c;在线创作平台 支持PDF直接导入生成仿真翻页电子书。提供15主题模板与字体库&a…...

【大模型技术】LlamaFactory 的原理解析与应用

LlamaFactory 是一个基于 LLaMA 系列模型&#xff08;如 LLaMA、LLaMA2、Vicuna 等&#xff09;的开源框架&#xff0c;旨在帮助开发者和研究人员快速实现大语言模型&#xff08;LLM, Large Language Model&#xff09;的微调、推理和部署。它提供了一套完整的工具链&#xff0…...

Golang依赖注入实战:从容器管理到应用实践

#作者&#xff1a;曹付江 文章目录 1、示例&#xff1a; 管理依赖关系的容器1.1. 日志记录器设置1.2. 数据库连接设置1.3. 管理依赖关系的容器 2、如何使用容器3、结论 依赖注入&#xff08;DI&#xff09;是一种在软件应用程序中促进松散耦合和可测试性的设计模式。它允许将依…...

Node.js二:第一个Node.js应用

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 创建的时候我们需要用到VS code编写代码 我们先了解下 Node.js 应用是由哪几部分组成的&#xff1a; 1.引入 required 模块&#xff1a;我们可以使用 requi…...

【Python爬虫】利用代理IP爬取跨境电商AI选品分析

引言 随着DeepSeek的流行&#xff0c;越来越多的用户开始尝试将AI工具融入到日常工作当中&#xff0c;借助AI的强大功能提高工作效率。最近又掀起了一波企业出海的小高潮&#xff0c;那么如果是做跨境电商业务&#xff0c;怎么将AI融入工作流中呢&#xff1f;在做跨境电商的时候…...

生命周期总结(uni-app、vue2、vue3生命周期讲解)

一、vue2生命周期 Vue2 的生命周期钩子函数分为 4 个阶段&#xff1a;创建、挂载、更新、销毁。 1. 创建阶段 beforeCreate&#xff1a;实例初始化之后&#xff0c;数据观测和事件配置之前。 created&#xff1a;实例创建完成&#xff0c;数据观测和事件配置已完成&#xff0c…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...