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

Leetcode-BFS问题

LeetCode-BFS问题

1.Floodfill问题
1.图像渲染问题 [https://leetcode.cn/problems/flood-fill/description/](https://leetcode.cn/problems/flood-fill/description/)
class Solution {public int[][] floodFill(int[][] image, int sr, int sc, int color) {//可以借助另一个数组来完成int rows=image.length;int cols=image[0].length;//默认为一个falseboolean nums2[][]=new boolean[rows][cols];int ret=image[sr][sc];image[sr][sc]=color;nums2[sr][sc]=true;int[] position=new int[]{sr,sc};Queue<int [] > queue=new LinkedList<>();queue.offer(position);while(!queue.isEmpty()) {int size=queue.size();while(size>0) {int [] nums1=queue.poll();int row=nums1[0];int col=nums1[1];if(row-1>=0 && image[row-1][col] ==ret && nums2[row-1][col]==false) {queue.offer(new int[]{row-1,col});nums2[row-1][col]=true;}if(col-1>=0 && image[row][col-1] ==ret && nums2[row][col-1]==false) {queue.offer(new int[]{row,col-1});nums2[row][col-1]=true;}if(col+1<=cols-1 && image[row][col+1] ==ret && nums2[row][col+1]==false) {queue.offer(new int[]{row,col+1});nums2[row][col+1]=true;}if(row+1<=rows-1 && image[row+1][col] ==ret && nums2[row+1][col]==false) {queue.offer(new int[]{row+1,col});nums2[row+1][col]=true;}image[row][col]=color;size--;}}return image;}
}

从一个位置开始将上下左右的连接起来的渲染成color。当我们拿到这道题的时候,可能想不到bfs也就是层序遍历。如果我仔细相想一下如果从一个点开始向周围蔓延,这有可能会想到层序遍历。

从(1,1)这个位置开始,这个位置值设为target,开始向上下左右四个方向遍历,如果值跟target相同就加入队列。但是问题也就来了 ,如果当我们遍历到左边时候,按照以上的说法仍会将右边的值加入到队列中。如下图所示

所以这个时候就初始化一个跟原有的数组一样大,来记录那些地方我们已经走过了,也就是代码上面的nums2数组,当我们加入到队列的时候,设置为true。队列中为一个二元组,是这个元素的横坐标和纵坐标。

2.岛屿数量 https://leetcode.cn/problems/number-of-islands/

class Solution {public int numIslands(char[][] grid) {char ret='1';//代表的是岛屿的标志boolean [][] nums2=new boolean[300][300];int ans=0;Queue<int [] >queue=new LinkedList<>();int rows=grid.length;int cols=grid[0].length;for(int i=0;i<rows;i++) {for(int j=0;j<cols;j++) {if(grid[i][j] == ret && nums2[i][j]==false) {queue.offer(new int []{i,j});nums2[i][j]=true;while(!queue.isEmpty()) {int size=queue.size();while(size>0) {int [] nums1=queue.poll();int row=nums1[0];int col=nums1[1];if(row-1>=0 && grid[row-1][col] ==ret && nums2[row-1][col]==false) {queue.offer(new int[]{row-1,col});nums2[row-1][col]=true;}if(col-1>=0 && grid[row][col-1] ==ret && nums2[row][col-1]==false) {queue.offer(new int[]{row,col-1});nums2[row][col-1]=true;}if(col+1<=cols-1 && grid[row][col+1] ==ret && nums2[row][col+1]==false) {queue.offer(new int[]{row,col+1});nums2[row][col+1]=true;}if(row+1<=rows-1 && grid[row+1][col] ==ret && nums2[row+1][col]==false) {queue.offer(new int[]{row+1,col});nums2[row+1][col]=true;}size--;}}ans++;}}}return ans;}
}

这道题是求连起来的岛屿的数量,也就是层序遍历了几次,统计层序遍历的结果。

这一段代码有一些冗余以及不美观,下面的题目会使用两个数组的形式来控制这个上下左右方向的走向。

3.岛屿的最大面积 https://leetcode.cn/problems/max-area-of-island/description/

class Solution {public int maxAreaOfIsland(int[][] grid) {//感觉还是一样的魔板int rows=grid.length;int cols=grid[0].length;int ret=1;//用来记录岛屿的面积int ans=0;Queue<int [] >queue=new LinkedList<>();boolean [][] nums2=new boolean [50][50];for(int i=0;i<rows;i++) {for(int j=0;j<cols;j++) {if(grid[i][j]==ret && nums2[i][j]==false) {queue.offer(new int[]{i,j});nums2[i][j]=true;int count=0;while(!queue.isEmpty()) {int size=queue.size();count+=size;while(size>0) {int [] nums1=queue.poll();int row=nums1[0];int col=nums1[1];if(row-1>=0 && grid[row-1][col] ==ret && nums2[row-1][col]==false) {queue.offer(new int[]{row-1,col});nums2[row-1][col]=true;}if(col-1>=0 && grid[row][col-1] ==ret && nums2[row][col-1]==false) {queue.offer(new int[]{row,col-1});nums2[row][col-1]=true;}if(col+1<=cols-1 && grid[row][col+1] ==ret && nums2[row][col+1]==false) {queue.offer(new int[]{row,col+1});nums2[row][col+1]=true;}if(row+1<=rows-1 && grid[row+1][col] ==ret && nums2[row+1][col]==false) {queue.offer(new int[]{row+1,col});nums2[row+1][col]=true;}size--;}}ans=Math.max(ans,count);}}}return ans;}
}

统计出岛屿的最大面积,就是在统计出岛屿的时候,再计算一步岛屿的面积,由于一个格子的面积是1。当我们进入到层序遍历的时候,使用count变量依次加上队列中这一层的格子数,注意一个岛屿一般都是有很多层的。进入到下一个岛屿遍历的时候,重新初始化count变量。

4.被围绕的区域 https://leetcode.cn/problems/surrounded-regions/description/

class Solution {int [] dx={1,-1,0,0};int [] dy={0,0,1,-1};public void solve(char[][] grid) {//感觉还是一样的魔板//先遍历周围的模块char tmp='A';int rows=grid.length;if(rows==0) {return;}int cols=grid[0].length;Queue<int [] > queue=new LinkedList<>();for(int i =0;i<cols;i++) {if(grid[0][i]=='O') {queue.offer(new int[] {0,i});grid[0][i]=tmp; }if(grid[rows-1][i]=='O') {queue.offer(new int[]{rows-1,i});grid[rows-1][i]=tmp;}}    for(int i=1;i<rows-1;i++) {if(grid[i][0]=='O') {queue.offer(new int []{i,0});grid[i][0]=tmp;}if(grid[i][cols-1]=='O') {queue.offer(new int[] {i,cols-1});grid[i][cols-1]=tmp;}}while(!queue.isEmpty()) {int [] nums1= queue.poll();int row=nums1[0];int col=nums1[1];for(int k=0;k<4;k++) {int a=row+dx[k],b=col+dy[k];if(a>=0 && a<rows && b>=0 && b<cols && grid[a][b]=='O' ) {queue.offer(new int []{a,b});grid[a][b]=tmp;}}}for(int i =0;i<rows;i++) {for(int j =0;j<cols;j++) {if(grid[i][j]==tmp) {grid[i][j]='O';}else if(grid[i][j]=='O') {grid[i][j]='X';}}}}
}

当我们还是按照上面题目的思想来解决这道题目的话,是行不通的。我们仔细观察题目只要区域中包含有外围的格子他就不是被包围的区域,于是我们先遍历周围的格子将周围相连的格子变成tmp,经过bfs之后再进行遍历数组,将tmp的变成’0’,将’0’变成’X’,正难则反,先将不被包围的区域变成一个tmp,再将被包围的区域变成一个’X’。

2.解决最短路问题
1.迷宫中离入口最近的出口 [https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/description/](https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/description/)
class Solution {public int nearestExit(char[][] nums, int[] entrance) {// +表示墙,.表示的是一个可走的路int rows=nums.length;int cols=nums[0].length;int [] dx=new int[] {0,0,1,-1};int [] dy=new int[] {1,-1,0,0};boolean [][] visit=new boolean[rows][cols];int a=entrance[0],b=entrance[1];Queue<int[] > queue=new LinkedList<>();queue.offer(new int[]{a,b});visit[a][b]=true;int ans=0;while(!queue.isEmpty()) {ans++;int size=queue.size();for(int i =0;i<size;i++) {int [] tmp=queue.poll();int row=tmp[0],col=tmp[1];for(int j=0;j<4;j++) {int x=row+dx[j],y=col+dy[j];if(x>=0 && y>=0 && x<rows && y<cols && !visit[x][y] && nums[x][y]=='.') {if(x==0 || x==rows-1 || y==0 || y==cols-1) {return ans;}queue.offer(new int[] {x,y});visit[x][y]=true;}}}}return -1;}
}

这里研究的最短路的问题边权都是为1的最短路问题。这里为什么能用bfs来解决,如下图说明。

以红点出发有四个方向可以走,上下左右四个方向。当然这里我们并没有实际走,只是在逻辑上走。

其实这个过程是将所有的结果给枚举出来,结果就是进行几次层序遍历。当我们碰到一个节点为’.'的时候,此时位置正好为边缘的时候,我们将结果返回。为什么进行几层层序遍历就是最小值呢,是因为我们在一层一层进行遍历,遍历的同时看是否到达出口,如果提前有出口,我们也就提前返回了。

2.最小基因变化 https://leetcode.cn/problems/minimum-genetic-mutation/description/

class Solution {public int minMutation(String start, String end, String[] bank) {if(bank.length==0 || bank==null) {return -1;} if(start==end) {return 0;}// 也就是说当我们在进行变化的时候,只有当是基因库中的才有效Queue<String> queue=new LinkedList<>();//这里使用哈希表来进行记录已经遍历过的Map<String,Boolean> hash=new HashMap<>();for(String str:bank) {hash.put(str,false);}int ans=0;char[] nums={'A','C','G','T'};queue.offer(start);while(!queue.isEmpty()) {int size=queue.size();ans++;while(size>0) {String tmp=queue.poll();for(int i=0;i<tmp.length();i++) {// 每个字符就会对应出4个结果for(int j =0;j<4;j++) {// 这里无法在原有的字符串上面进行更改值String ret= tmp.substring(0,i)+nums[j]+tmp.substring(i+1,8);if(ret.equals(end) && hash.containsKey(ret)) {return ans;}if(hash.containsKey(ret) && hash.get(ret)==false) {queue.offer(ret);hash.put(ret,true);}}}size--;}}return -1;}
}

首先,先创建出一个哈希表用来标志这个基因是否到达过。每个基因的就是一个字符串都是等长的,在每个位置进行变换,于是就有了String ret= tmp.substring(0,i)+nums[j]+tmp.substring(i+1,8);这一行代码。剩下的就是跟之前是一样的,这里的变化必须是基因库的。

3.单词接龙 https://leetcode.cn/problems/om3reC/description/

class Solution {public int ladderLength(String start, String end, List<String> word) {Map<String,Boolean> hash=new HashMap<>();int len=start.length();int ans=1;for(String str : word) {hash.put(str,false);}Queue<String> queue=new LinkedList<>();queue.offer(start);while(!queue.isEmpty()) {ans++;int size=queue.size();while(size>0) {String tmp=queue.poll();for(int i=0;i<len;i++) {for(int j=0;j<26;j++) {char ch=(char)('a'+j);String ret=tmp.substring(0,i)+ch+tmp.substring(i+1,len);if(ret.equals(end) && hash.containsKey(ret)) {return ans;}if(hash.containsKey(ret) && hash.get(ret)==false) {queue.offer(ret);hash.put(ret,true);}}}size--;}}return 0;}
}

这道题跟上面的题是一样,只不过换了一个问法。这里是所以可以使用最短路径解决这道题是因为一个单词可以变换成很多的结果,同时结果单词又能变化成很多单词。

4.为高尔夫比赛砍树 https://leetcode.cn/problems/cut-off-trees-for-golf-event/description/

class Solution {int []dx={-1,1,0,0};int []dy={0,0,-1,1};int ans=0;public int cutOffTree(List<List<Integer>> forest) {if(forest.get(0).get(0)==0) {return -1;}List<int[]> list=new ArrayList<>();int rows=forest.size();int cols=forest.get(0).size();for(int i =0;i<rows;i++) {for(int j=0;j<cols;j++) {if(forest.get(i).get(j)>1) {list.add(new int[]{i,j});}}}//对这个数组进行排序Collections.sort(list, (a, b) -> forest.get(a[0]).get(a[1]) - forest.get(b[0]).get(b[1]));int row=0;int col=0;for(int i=0;i<list.size();i++) {//其实在判断的时候只是要一个位置而已//row和col是刚开始位置,肯定要按照顺序找int temp=bfs(forest,row,col,list.get(i)[0],list.get(i)[1]);if(temp==-1) {return -1;}ans+=temp;row=list.get(i)[0];col=list.get(i)[1];}return ans;       }public int bfs(List<List<Integer>> forest,int row,int col,int targetx,int targety) {if(row==targetx && col==targety) {return 0;}//接下里就是宽度搜索//其实找到最小的位置,但是注意不能通行的地方Queue<int[]> queue=new LinkedList<>();int rows=forest.size();int cols=forest.get(0).size();boolean [][]nums=new boolean[rows][cols];int ret=0;queue.offer(new int []{row,col});nums[row][col]=true;while(!queue.isEmpty()) {int size=queue.size();ret++;while(size>0) {int[] temp=queue.poll();for(int i=0;i<4;i++) {int a=dx[i]+temp[0];int b=dy[i]+temp[1];if(a>=0 && a<rows && b>=0 && b<cols) {if(forest.get(a).get(b)>0 && !nums[a][b]) {if(a==targetx && b==targety) {return ret;}queue.offer(new int[]{a,b});nums[a][b]=true;}}}size--;}}return -1;}
}

首先我们看到题目是要求是从低到高开始砍树,先将所有大于的1位置以二元组的形式,可以使用pair,也可以使用数组的形式加入到数组中。然后对数组进行排序,先从(0,0)位置开始向最小的那个位置开始层序遍历,如果途中我们返回了-1的时候,说明四周遇到了障碍。 boolean [][]nums=new boolean[rows][cols];这个每次调用bfs函数的时候,就创建一次。如下图

当从9到10的时候,同时还会遍历8,1,3,4,6,7这些数字,如果我们将这些数字设置为不能再走了 ,此时返回的结果与预期的结果不同。所以每次进行bfs的时候都重新创建一个nums数组。

相关文章:

Leetcode-BFS问题

LeetCode-BFS问题 1.Floodfill问题 1.图像渲染问题 [https://leetcode.cn/problems/flood-fill/description/](https://leetcode.cn/problems/flood-fill/description/) class Solution {public int[][] floodFill(int[][] image, int sr, int sc, int color) {//可以借助另一…...

AI 时代 UI 设计的未来范式

在人工智能技术持续突破的浪潮下&#xff0c;UI 设计领域正经历着前所未有的变革。AI 的深度介入不仅重塑了设计流程&#xff0c;更催生了全新的设计范式&#xff0c;为用户带来颠覆式的交互体验。探索 AI 时代 UI 设计的未来范式&#xff0c;是把握行业发展趋势的关键所在。​…...

键盘输出希腊字符方法

在不同操作系统中&#xff0c;输出希腊字母的方法有所不同。以下是针对 Windows 和 macOS 系统的详细方法&#xff0c;以及一些通用技巧&#xff1a; 1.Windows 系统 1.1 使用字符映射表 字符映射表是一个内置工具&#xff0c;可以方便地找到并插入希腊字母。 • 步骤&#xf…...

[数据结构高阶]并查集初识、手撕、可以解决哪类问题?

标题&#xff1a;[数据结构高阶]并查集初识、手撕、可以解决哪类问题&#xff1f; 水墨不写bug 文章目录 一、认识并查集二、模拟实现并查集三、用并查集解决问题1、[省份的数量](https://leetcode.cn/problems/number-of-provinces/)2、[等式方程的可满足性](https://leetcode…...

BUUCTF——PYWebsite

BUUCTF——PYWebsite 进入靶场 看看基本信息 没有什么信息 扫个目录看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html访问flag.php 提示保存购买者的IP 抓包看看 直接XFF伪造一下 X-Forwarded-F…...

【学习笔记】机器学习(Machine Learning) | 第六章(2)| 过拟合问题

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 解决过拟合问题一、收集更多训练数据二、选择特征三、正则化四、过拟合解决方法总结 过…...

单片机-STM32部分:13-1、编码器

飞书文档https://x509p6c8to.feishu.cn/wiki/BpEywhaX9iqbiLkdqdAcmDnwnab EC旋转编码器 在产品开发过程中&#xff0c;需要位置闭环的的产品&#xff0c;类似电机类产品来说&#xff0c;编码器至关重要&#xff0c;它不仅可以使我们对带年纪进行精确的速度闭环&#xff0c;位…...

浅谈大语言模型原理

1.反向传播算法 背景 反向传播算法是当前深度学习的核心技术。 神经网络 x是输入&#xff0c;o是输出&#xff0c;w是需要训练的参数&#xff08;w有初始值&#xff09;三层全连接的神经网络&#xff1a;输入层、隐藏层、输出层 激活函数 f ( x ) 1 1 x − 1 f(x)\frac…...

设计模式之中介者模式

在我们实际开发中&#xff0c;我们经常会遇到多个对象之间互相依赖、互相调用的场景。如果这些对象之间的耦合度太高&#xff0c;不仅会让系统变得难以维护&#xff0c;还会让扩展变得异常困难。此时&#xff0c;中介者模式(Mediatro)就是一种非常实用的设计方案&#xff0c;它…...

Matlab 空调温度时延模型的模糊pid控制

1、内容简介 Matlab 231-空调温度时延模型的模糊pid控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略中央空调温湿度采用PID控制系统的探讨.pdf 中央空调房间温度智能 PID控制的仿真研究.pdf...

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 创建 Spring 项目后&#xff0c;引入依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…...

C++修炼:模板进阶

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...

Spring Boot集成RabbitMQ高级篇:可靠性与性能提升

一、环境准备 安装 RabbitMQ 在官网上下载对应操作系统的安装包&#xff08;如 Windows、Linux 等&#xff09;&#xff0c;按照安装向导完成安装。 安装完成后&#xff0c;启动 RabbitMQ 服务。在 Windows 系统下&#xff0c;可以在服务列表中找到 RabbitMQ Server 并启动&am…...

Shell脚本编程3(函数+正则表达式)

1.函数 1.1 定义 简单来讲&#xff0c;所谓函数就是把完成特定功能&#xff0c;并且多次使用的一组命令或者语句封装在一个固定的结构中&#xff0c;这个结构我们就叫做函数。从本质上讲&#xff0c;函数是将一个函数名与某个代码块进行映射。也就是说&#xff0c;用户在定义了…...

【C++】语言深处的“精灵”:探索内存的奥妙

这里我们要知道&#xff0c;我们编写一个程序&#xff0c;这个程序中的变量是存储在哪个区域的 栈一般是用于静态的分配内存的&#xff0c;但也可以动态的分配内存&#xff0c; 堆是用于动态的分配内存的&#xff0c;不能静态的分配内存 栈&#xff1a; 通常是向低地址方向…...

c语言第一个小游戏:贪吃蛇小游戏03

我们为贪吃蛇的节点设置为一个结构体&#xff0c;构成贪吃蛇的身子的话我们使用链表&#xff0c;链表的每一个节点是一个结构体 显示贪吃蛇身子的一个节点 我们这边node就表示一个蛇的身体 就是一小节 输出结果如下 显示贪吃蛇完整身子 效果如下 代码实现 这个hasSnakeNode(…...

51 单片机头文件 reg51.h 和 reg52.h 详解

51 单片机头文件详解 51 单片机的头文件reg51.h和reg52.h是开发中非常重要的文件,它们定义了单片机的特殊功能寄存器 (SFR) 和位地址。以下是对这两个头文件的详细解析: 1. 头文件概述 reg51.h:针对标准 8051 单片机(4KB ROM, 128B RAM) reg52.h:针对增强型 8052 单片…...

让 - 艾里克・德布尔与斯普林格出版公司:科技变革下的出版业探索

在数字化浪潮席卷全球的当下&#xff0c;传统出版行业面临着前所未有的挑战与机遇。《对话 CTO&#xff0c;驾驭高科技浪潮》的第 10 章聚焦于让 - 艾里克・德布尔&#xff08;Jean - Eric Debeure&#xff09;及其所在的斯普林格出版公司&#xff08;Springer Publishing Comp…...

[python] 面向对象的三大特性-封装及新式类

一 继承 继承是指一个类&#xff08;子类&#xff09;可以继承另一个类&#xff08;父类&#xff09;的属性和方法&#xff0c;并可以在其基础上进行扩展或修改。 子类可以继承父类的属性和方法,包括私有属性和隐藏属性 &#x1f4a1; 核心思想&#xff1a; 避免重复代码&…...

winreg查询Windows注册表的一些基本用法

注册表是Windows操作系统中用于存储配置信息的数据库。它包含了关于系统硬件、已安装的应用程序、用户账户设置以及系统设置的信息。 特别地&#xff0c;当我们需要某些软件的配置配息时&#xff0c;主要在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下的SoftWare内进行查询操作。 …...

DHCP自动分配IP

DHCP自动分配IP 练习1 路由器 Router>en Router#conf t Router(config)#ip dhcp pool ip10 //创建DHCP地址池 Router(dhcp-config)#network 192.168.20.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#default-router 192.168.20.254 //配置默认网关 Rou…...

互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

TDengine 在金融领域的应用

简介 金融行业正处于数据处理能力革新的关键时期。随着市场数据量的爆炸式增长和复杂性的日益加深&#xff0c;金融机构面临着寻找能够高效处理大规模、高频次以及多样化时序数据的大数据处理系统的迫切需求。这一选择将成为金融机构提高数据处理效率、优化交易响应时间、提高…...

十三、动态对象创建(Dynamic Object Creation)

十三、动态对象创建&#xff08;Dynamic Object Creation&#xff09; 目录 13.1 对象创建&#xff08;Object creation&#xff09;13.2 new / delete 操作符13.3 数组的 new 与 delete13.4 总结 背景说明 有时候我们需要知道程序中对象的数量、类型和声明周期&#xff0c;…...

cursor Too many报错 显示锁机器码怎么办?也就是Cursor的

22. Too many报错 显示锁机器码怎么办&#xff1f;也就是Cursor的 文档出自&#xff1a;https://www.kdocs.cn/l/cp5GpLHAWc0p...

window 显示驱动开发-将虚拟地址映射到内存段(二)

在将虚拟地址映射到段的一部分之前&#xff0c;视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数&#xff0c;以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈&#xff0c;也不能更改分配…...

Linux 软硬连接详解

目录 一、软链接&#xff08;Symbolic Link&#xff09; ‌定义与特性 ‌实现方法‌使用 ln -s 命令&#xff1a; 二、硬链接&#xff08;Hard Link&#xff09; 1、是什么 2、工作机制 3、实现方式 一、软链接&#xff08;Symbolic Link&#xff09; ‌定义与特性 定义…...

虚拟主机与独立服务器:哪个更好?

在选择网站主机提供商时&#xff0c;你可以选择独立服务器或者与其他用户共同使用的虚拟主机。这个决定不仅仅是基于价格&#xff0c;还有很多其他因素需要考虑。接下来&#xff0c;我们就来详细了解一下虚拟主机和独立服务器的区别。 虚拟主机和独立服务器的区别 独立服务器是…...

MiMo-7B-RL调研

结论 MiMo 在数学推理和代码竞赛的评测中表现出色&#xff0c;但是相较于 OpenAI 的 o1-mini 和阿里的 QwQ-32B-Preview 等更大规模的模型&#xff0c;推理耗时更长&#xff08;4 到 10 倍&#xff09;&#xff0c;花费 Token 更多。 链接 开源地址: https://huggingface.co/…...

vue-i18n 优化

语言包管理优化&#xff1a; 当前语言包文件&#xff08;en.json 和 zh.json&#xff09;过大&#xff0c;建议按模块拆分建议的目录结构&#xff1a; src/assets/i18n/ ├── modules/ │ ├── common/ │ ├── dashboard/ │ ├── report/ │ └── system/ …...

全栈工程师实战手册:LuatOS日志系统开发指南!

本文聚焦LuatOS-log库的实战应用场景&#xff0c;通过完整案例演示日志模块集成、格式定制及远程同步方案&#xff0c;帮助全栈开发者构建灵活可靠的日志管理框架。下面&#xff0c;我们一起来认识LuatOS的log库&#xff01; 一、 log.info() log info()主要打印一些正常的…...

Java知识库网站整理

本文主要推荐一些高质量的Java知识库和学习网站&#xff0c;涵盖了从基础到高级的Java技术&#xff0c;包括JVM底层原理、框架源码分析、面试题集、全栈知识体系等。如果你有其他优秀的Java学习网站推荐&#xff0c;欢迎在评论区分享&#xff01; 如遇到以下网站不能打开请检查…...

详解 IRC协议 及客户端工具 WeeChat 的使用

本文将详细介绍 Internet Relay Chat&#xff08;IRC&#xff09;协议及其历史、基本概念、核心功能&#xff0c;以及流行的 IRC 客户端 WeeChat 的安装、配置和使用方法。内容力求准确、详尽&#xff0c;涵盖 IRC 的技术背景、使用场景&#xff0c;以及 WeeChat 的高级功能和实…...

数据出境的安全合规思考

数据已成为新型国家战略性资产&#xff0c;其经济和战略价值在全球数字经济发展中愈加凸显。跨境数据流动既是重要的经济纽带&#xff0c;又是新兴的经济秩序博弈焦点&#xff0c;对于推动经济全球化发展意义重大。然而&#xff0c;跨境数据流动也面临诸多问题与挑战&#xff0…...

【技巧】使用frpc点对点安全地内网穿透访问ollama服务

回到目录 【技巧】使用frpc点对点安全地内网穿透访问ollama服务 0. 为什么需要部署内网穿透点对点服务 在家里想访问单位强劲机器&#xff0c;但是单位机器只能单向访问互联网&#xff0c;互联网无法直接访问到这台机器。通过在云服务器、单位内网服务器、源端访问机器上&am…...

Go语言即时通讯系统 开发日志day1

Go语言即时通讯系统开发日志day1&#xff0c;主要模拟实现的一个简单的发送消息和接受消息的小demo&#xff0c;因为也才刚学习go语言的语法&#xff0c;对go的json、net/http库了解不多&#xff0c;所以了解了一下go语言的encoding/json库和net/http库&#xff0c;以及websock…...

多线程访问Servlet如何谨慎处理共享资源

1. 避免共享状态&#xff08;最佳实践&#xff09; 核心思想&#xff1a;Servlet 本身应设计为无状态&#xff08;Stateless&#xff09;&#xff0c;不依赖实例变量存储请求相关数据。 实现方式&#xff1a; 将变量声明在方法内部&#xff08;局部变量&#xff09;&#xff0…...

OpenMCU(六):STM32F103开发板功能介绍

概述 距上一篇关于STM32F103的FreeRTOS博客的发布已经过去很长时间没有更新了。在这段时间内&#xff0c;大家可以看到博主发表了一系列的关于使用qemu 模拟实现STM32F103的博客&#xff0c;博主本来想借助qemu开发stm32F103相关的一些软件功能&#xff0c;博主开发出来并成功运…...

运用数组和矩阵对数据进行存取和运算——NumPy模块 之五

目录 NumPy模块介绍 3.5.1 NumPy 操纵数组元素的逻辑 3.5.2 添加数组元素操作 1. append() 函数 2. insert() 函数 3.5.3 删除数组元素的操作 delete() 函数 3.5.4 数组元素缺失情况的处理 isnan() 函数 3.5.5 处理数组中元素重复情况 unique() 函数 3.5.6 拼接数组操作 1. con…...

AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent

开篇 我们之前花了将近10个篇章讲Dify的一些基础应用,包括在讲Dify之前我们讲到了几十个AI Agent的开发例子,我不知道大家发觉了没有,在AI Agent开发过程中我们经常会伴随着这样的一些问题: 需要经常改猫娘;需要经常改调用LLM的参数,甚至在一个流程中有3个节点,每个节点…...

日志 Slf4j , Java 中使用

// 示例代码package biz.baijing.controller;import biz.baijing.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…...

Matlab 单机无穷大系统故障

1、内容简介 Matlab 236-单机无穷大系统故障 可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;短路是电力系统中最容易发生的故障&#xff0c;每年因短路而引发的电气事故不计其数。本文详细介绍了短路故障产生的原因以及危害等&#xff0c;并重点介绍了Simulink仿真工…...

Hadoop区别

Hadoop • 定义 • Hadoop是一个由Apache基金会开发的分布式计算平台。它主要包括HDFS&#xff08;Hadoop Distributed File System&#xff09;和MapReduce编程模型。HDFS用于存储大规模数据&#xff0c;它将文件分割成多个数据块&#xff08;block&#xff09;&#xff0c;并…...

【软件工程】软件缺陷 基于组合的优化方法

在软件缺陷检测中&#xff0c;基于组合的优化方法主要通过数学和计算策略高效地探索可能的解空间&#xff0c;以解决测试用例生成、缺陷定位和预测等问题。以下是其关键要点和应用场景的整理&#xff1a; 1. 组合优化在软件缺陷检测中的应用场景 测试用例生成 组合测试&#xf…...

python opencv 将不同shape尺寸的图片制作video视频

python opencv 将不同shape尺寸的图片制作video视频。 具体代码实现如下&#xff1a; import os import cv2 import time import shutil def resize_img_keep_ratio(img, target_size):old_size img.shape[:2] # 原始图像大小ratio min(target_size[i] / old_size[i] for …...

Open CASCADE学习|由大量Edge构建闭合Wire:有序与无序处理的完整解析

在CAD建模中,构建闭合的Wire(线框)是拓扑结构生成的基础操作。OpenCascade(OCCT)作为强大的几何建模库,支持从离散的Edge(边)构建Wire,但在实际应用中,边的有序性直接影响构建的成功率。本文将详细探讨有序与无序两种场景下的实现方法,并提供完整代码示例。 一、有序…...

在IDEA中导入gitee项目

一、导入前准备工作 1、下载gitee插件 2、下载好之后就能在VCS中找到share Project on gitee。 二、导入 1、回到idea主页面 2、可以授权登录绑定gitee账号&#xff0c;就可以直接打开仓库。&#xff08;条件是这个是要打开自己仓库里的代码&#xff09; 3、也可以复制看见的…...

Edge Remover v18.7 绿色版:轻松卸载 Edge 浏览器,彻底清理残留数据

Edge Remover 是一款专门用于卸载 Microsoft Edge 浏览器及其 WebView2 运行时的工具。它能够彻底删除 Edge 浏览器及其相关组件&#xff0c;包括所有文件、注册表项和其他残留数据。此外&#xff0c;Edge Remover 还可以防止 Windows 更新自动重新安装 Edge 浏览器。 软件功能…...

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时&#xff0c;开发者经常会在 Podfile 文件中看到一个配置选项&#xff1a;use_frameworks!。本文将详细介绍这个配置选项的含义&#xff0c;以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…...

Vue学习百日计划-Gemini版

核心理念&#xff1a; 基础先行&#xff1a; HTML, CSS, JavaScript 是前端的基石&#xff0c;必须扎实。聚焦 Vue 3&#xff1a; 学习当前主流的 Vue 3 版本&#xff0c;重点掌握 Composition API。实践驱动&#xff1a; 每个阶段都要有项目练习&#xff0c;理论结合实践。生…...