【日常系列】LeetCode《19·BFS 和 DFS》

news2024/10/6 5:54:22

数据规模->时间复杂度

<=10^4 😮(n^2)
<=10^7:o(nlogn)
<=10^8:o(n)
10^8<=:o(logn),o(1)

内容

在这里插入图片描述

lc 589 :N 叉树的前序遍历
https://leetcode.cn/problems/n-ary-tree-preorder-traversal/
提示:
节点总数在范围 [0, 104]内
0 <= Node.val <= 104
n 叉树的高度小于或等于 1000
进阶:
递归法很简单,你可以使用迭代法完成此题吗?

#方案一:迭代
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        if not root:return []
        #
        res=[]
        stack=list()
        stack.append(root)
        while stack:
            curr=stack.pop()
            res.append(curr.val)
            #key
            for i in range(len(curr.children)-1,-1,-1):
                stack.append(curr.children[i])
        #
        return res
#方案二:递归
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        if not root:return []
        #
        res=[]
        self.dfs(root,res)
        return res
    
    def dfs(self,node,res):
        if not node:return
        res.append(node.val)
        #key
        for children in node.children:
            self.dfs(children,res)
        # for i in range(len(node.children)):
        #     self.dfs(node.children[i],res)

lc 590 :N 叉树的后序遍历
https://leetcode.cn/problems/n-ary-tree-postorder-traversal/
提示:
节点总数在范围 [0, 104] 内
0 <= Node.val <= 104
n 叉树的高度小于或等于 1000
进阶:
递归法很简单,你可以使用迭代法完成此题吗?

#方案一:迭代
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def postorder(self, root: 'Node') -> List[int]:
        if not root:return []
        res=list()
        stack=[] #list()
        stack.append(root)
        
        while stack:
            curr=stack.pop()
            res.append(curr.val)
            #
            for childnode in curr.children:
                stack.append(childnode) #key
        res.reverse()
        return res
        
#方案二:递归
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def postorder(self, root: 'Node') -> List[int]:
        res=[]
        self.dfs(root,res)
        return res

    def dfs(self,node,res):
        if not node:return
        #
        for child in node.children:
            self.dfs(child,res)
        res.append(node.val)

lc 429 :N 叉树的层序遍历
https://leetcode.cn/problems/n-ary-tree-level-order-traversal/
提示:
树的高度不会超过 1000
树的节点总数在 [0, 10^4] 之间

#方案一:BFS
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root:return []
        res=[]
        queue=deque()
        queue.append(root)
        while queue:
            level_nodes_val=[]
            for i in range(len(queue)):
                curr=queue.popleft()
                level_nodes_val.append(curr.val) #key
                for child in curr.children:
                    queue.append(child)
            res.append(level_nodes_val)
        return res

#方案二:DFS
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        res=[]
        self.dfs(root,0,res)
        return res
    
    def dfs(self,node,currlevel,res):
        if not node:return []
        #key
        if len(res)-1 <currlevel:
            res.append([node.val])
        else:
            res[currlevel].append(node.val)
        #
        for child in node.children:
            self.dfs(child,currlevel+1,res)

lc 690 :员工的重要性
https://leetcode.cn/problems/employee-importance/
提示:
一个员工最多有一个 直系 领导,但是可以有多个 直系 下属
员工数量不超过 2000 。
在这里插入图片描述

#方案一:DFS-前序
"""
# Definition for Employee.
class Employee:
    def __init__(self, id: int, importance: int, subordinates: List[int]):
        self.id = id
        self.importance = importance
        self.subordinates = subordinates
"""

class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        self.id_map={emp.id:emp for emp in employees} #key:id-emp
        self.total=0 #key
        self.dfs(id)
        return self.total
    
    def dfs(self,id):
        emp=self.id_map[id]
        if not emp:return
        #
        self.total+=emp.importance
        #
        for sub_emp_id in emp.subordinates:
            self.dfs(sub_emp_id)

#方案二:DFS-后序
"""
# Definition for Employee.
class Employee:
    def __init__(self, id: int, importance: int, subordinates: List[int]):
        self.id = id
        self.importance = importance
        self.subordinates = subordinates
"""

class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        self.id_map={emp.id:emp for emp in employees} #key:id-emp
        return self.dfs(id)
    
    def dfs(self,id):
        emp=self.id_map[id]
        if not emp:return 0
        #dfs的时候(self.total=0)先累加子节点值,最后在加根节点(root.importance)
        self.total=0  #key:注意位置,
        for sub_emp_id in emp.subordinates:
            self.total+=self.dfs(sub_emp_id) 
            
        return emp.importance+self.total


#方案三:BFS
"""
# Definition for Employee.
class Employee:
    def __init__(self, id: int, importance: int, subordinates: List[int]):
        self.id = id
        self.importance = importance
        self.subordinates = subordinates
"""

class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        self.id_map={emp.id:emp for emp in employees} #key:id-emp
        return self.bfs(id)
    
    def bfs(self,id):
        emp=self.id_map[id]
        if not emp:return 0
        #
        res=0
        queue=deque()
        queue.append(emp)
        while queue:
            levelres=0
            for i in range(len(queue)):
                curr=queue.popleft()
                levelres+=curr.importance
                for sub_id in curr.subordinates:
                    queue.append(self.id_map[sub_id]) #key
            res+=levelres
        return res

图的 DFS 和 BFS:key-遍历过程中,设置节点访问

在这里插入图片描述在这里插入图片描述在这里插入图片描述

floodfill 算法基础

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

#数组二维转一维
#数组一维转二维度
#二维数组的四联通
#二维数组的八联通
#保证索引访问合法

lc 733 :图像渲染
https://leetcode.cn/problems/flood-fill/
提示:
m == image.length
n == image[i].length
1 <= m, n <= 50
0 <= image[i][j], newColor < 216
0 <= sr < m
0 <= sc < n
在这里插入图片描述

#方案一:DFS
class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.image=image
        self.visited=[[False]*len(self.image[0]) for _ in range(len(self.image))]
        self.oldcolor=self.image[sr][sc]
        
        self.dfs(sr,sc,color)
        return image
    
    def inarea(self,row,col):
        return row>=0 and row<len(self.image) and col>=0 and col<len(self.image[0])
    
    def dfs(self,row,col,newcolor):
        #终止条件
        if not self.inarea(row,col) or self.image[row][col]!=self.oldcolor:
            return
        #
        self.image[row][col]=newcolor
        self.visited[row][col]=True
        for dir in self.dirs: 
            next_row=row+dir[0]
            next_col=col+dir[1]
            if self.inarea(next_row,next_col):
                if not self.visited[next_row][next_col]: 
                    self.dfs(next_row,next_col,newcolor)
#方案二:BFS
class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
        self.image=image
        self.old_color=image[sr][sc]
        if self.old_color == color:  #key
            return image

        self.dirs=[[0,1],[0,-1],[1,0],[-1,0]]
        self.bfs(sr,sc,color)
        return self.image
    
    def inarea(self,row,col):
        return row>=0 and row<len(self.image) and col>=0 and col<len(self.image[0])

    def bfs(self,row,col,newcolor): 
        queue=deque()
        queue.append([row,col])
        self.image[row][col]=newcolor
        while queue:
            curr=queue.popleft()
            #
            for dir in self.dirs: #key1
                nextrow=dir[0]+curr[0]
                nextcol=dir[1]+curr[1]
                if self.inarea(nextrow,nextcol) and self.image[nextrow][nextcol]==self.old_color:
                    queue.append([nextrow,nextcol]) #key1
                    self.image[nextrow][nextcol]=newcolor

lc 463 :岛屿的周长
https://leetcode.cn/problems/island-perimeter/
提示:
row == grid.length
col == grid[i].length
1 <= row, col <= 100
grid[i][j] 为 0 或 1
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连(只有一个岛
在这里插入图片描述在这里插入图片描述

#方案一:DFS-前序
class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        self.grid=grid
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.visited=[[False]*len(grid[0]) for _ in range(len(grid))]
        #
        self.ans=0
        for i in range(len(self.grid)):
            for j in range(len(self.grid[0])):
                if self.grid[i][j]==1:
                    self.dfs(i,j)
                    return self.ans
    
    def inarea(self,row,col):
        return row>=0 and row<len(self.grid) and col>=0 and col<len(self.grid[0])

    def dfs(self,row,col):
        if not self.inarea(row,col) or self.grid[row][col]==0 or self.visited[row][col]:
            return
        #
        self.visited[row][col]=True
        for dir in self.dirs:
            nextrow=dir[0]+row
            nextcol=dir[1]+col
            #key:计边长
            if not self.inarea(nextrow,nextcol) or self.grid[nextrow][nextcol]==0:
                self.ans+=1
            elif not self.visited[nextrow][nextcol]:
                self.dfs(nextrow,nextcol)
            
#方案二:DFS-后序
class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        self.grid=grid
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.visited=[[False]*len(grid[0]) for _ in range(len(grid))]
        #
        for i in range(len(self.grid)):
            for j in range(len(self.grid[0])):
                if self.grid[i][j]==1:
                    return self.dfs(i,j)
    
    def inarea(self,row,col):
        return row>=0 and row<len(self.grid) and col>=0 and col<len(self.grid[0])

    def dfs(self,row,col):
        if not self.inarea(row,col) or self.grid[row][col]==0:
            return 1
        if self.visited[row][col]:
            return 0  #说明接壤
        #
        ans=0
        self.visited[row][col]=True
        for dir in self.dirs:
            nextrow=dir[0]+row
            nextcol=dir[1]+col
            ans+=self.dfs(nextrow,nextcol) #key:基于'四边'情况统计
        return ans  #对比lc690

#方案三:BFS
class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        self.grid=grid
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.visited=[[False]*len(grid[0]) for _ in range(len(grid))]
        #
        for i in range(len(self.grid)):
            for j in range(len(self.grid[0])):
                if self.grid[i][j]==1:
                    return self.bfs(i,j)
    
    def inarea(self,row,col):
        return row>=0 and row<len(self.grid) and col>=0 and col<len(self.grid[0])

    def bfs(self,row,col):
        queue=deque()
        queue.append([row,col])
        self.visited[row][col]=True
        #
        ans=0
        while queue:
            curr=queue.popleft()
            for dir in self.dirs:
                nextrow=curr[0]+dir[0]
                nextcol=curr[1]+dir[1]
                if not self.inarea(nextrow,nextcol) or self.grid[nextrow][nextcol]==0:
                    ans+=1
                elif not self.visited[nextrow][nextcol]: #key
                    queue.append([nextrow,nextcol])
                    self.visited[nextrow][nextcol]=True
        return ans     

lc 200 :岛屿数量【top100】
https://leetcode.cn/problems/number-of-islands/
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 ‘0’ 或 ‘1’

#DFS:
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        self.grid=grid
        self.rows=len(grid)
        self.cols=len(grid[0])
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.visited=[[False]*self.cols for _ in range(self.rows)]
        #
        ans=0
        for i in range(self.rows):
            for j in range(self.cols):
                if self.grid[i][j]=="1" and not self.visited[i][j]:
                    self.dfs(i,j)
                    ans+=1
        #
        return ans

    def inarea(self,row,col):
        return self.rows>row>=0 and self.cols>col>=0

    def dfs(self,row,col):
        if not self.inarea(row,col) or self.grid[row][col]=='0' or self.visited[row][col]:
            return
        self.visited[row][col]=True
        for dir in self.dirs:
            nextrow=row+dir[0]
            nextcol=col+dir[1]
            self.dfs(row,col)

lc 695 :岛屿的最大面积
https://leetcode.cn/problems/max-area-of-island/
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j] 为 0 或 1
在这里插入图片描述

#DFS-后序:
class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        self.grid=grid
        self.rows=len(grid)
        self.cols=len(grid[0])
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.visited=[[False]*self.cols for _ in range(self.rows)]
        #
        maxans=0
        for i in range(self.rows):
            for j in range(self.cols):
                if self.grid[i][j]==1 and not self.visited[i][j]:
                    maxans=max(self.dfs(i,j),maxans)
        #
        return maxans

    def inarea(self,row,col):
        return self.rows>row>=0 and self.cols>col>=0

    def dfs(self,row,col):
        if not self.inarea(row,col) or self.grid[row][col]==0 or self.visited[row][col]:#key:递归中接壤也是0
            return 0
        #
        self.visited[row][col]=True
        ans=0
        for dir in self.dirs:
            nextrow=row+dir[0]
            nextcol=col+dir[1]
            ans+=self.dfs(nextrow,nextcol)
        return 1+ans

lc 130 :被围绕的区域
https://leetcode.cn/problems/surrounded-regions/
提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j] 为 ‘X’ 或 ‘O’
在这里插入图片描述

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        self.rows=len(board)
        self.cols=len(board[0])
        self.board=board
        self.visited=[[False]*self.cols for _ in range(self.rows)]
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        #边界
        for j in range(self.cols):
            if self.board[0][j]=='O' and not self.visited[0][j]:self.dfs(0,j)
            if self.board[self.rows-1][j]=='O' and not self.visited[self.rows-1][j]:self.dfs(self.rows-1,j)
        for i in range(1,self.rows-1):
            if self.board[i][0]=='O' and not self.visited[i][0]:self.dfs(i,0)
            if self.board[i][self.cols-1]=='O' and not self.visited[i][self.cols-1]:self.dfs(i,self.cols-1)
        #替换
        for i in range(self.rows):
            for j in range(self.cols):
                if self.board[i][j]=='O' and not self.visited[i][j]:
                    self.board[i][j]='X'
        
    def area(self,row,col):
        return 0<=row<self.rows and 0<=col<self.cols
    def dfs(self,row,col):
        if not self.area(row,col) or self.board[row][col]=='X' or self.visited[row][col]:
            return 
        #
        self.visited[row][col]=True
        for dir in self.dirs:
            nextrow=row+dir[0]
            nextcol=col+dir[1]
            self.dfs(nextrow,nextcol)  

lc 1034 :边框着色
https://leetcode.cn/problems/coloring-a-border/
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
1 <= grid[i][j], color <= 1000
0 <= row < m
0 <= col < n
在这里插入图片描述
在这里插入图片描述

class Solution:
    def colorBorder(self, grid: List[List[int]], row: int, col: int, color: int) -> List[List[int]]:
        #
        self.color=color
        self.currcolor=grid[row][col]
        if grid[row][col]==color:return grid
        #
        self.rows=len(grid)
        self.cols=len(grid[0])
        self.grid=grid
        self.visited=[[False]*self.cols for _ in range(self.rows)]
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1]]
        self.dfs(row,col)
        return self.grid
    
    
    def area(self,row,col):
        return 0<=row<self.rows and 0<=col<self.cols
    def dfs(self,row,col):
        if not self.area(row,col) or self.grid[row][col]!=self.currcolor or self.visited[row][col]:
            return 
        #通过(nextrow,nextcol)对当前顶点判定及递归
        self.visited[row][col]=True
        for dir in self.dirs:
            nextrow=row+dir[0]
            nextcol=col+dir[1]
            #key条件
            if not self.area(nextrow,nextcol) or (self.grid[nextrow][nextcol]!=self.currcolor and not self.visited[nextrow][nextcol]):
                self.grid[row][col]=self.color #key-not [nextrow][nextcol]
            #
            self.dfs(nextrow,nextcol)

lc 529 :扫雷游戏
https://leetcode.cn/problems/minesweeper/
提示:
m == board.length
n == board[i].length
1 <= m, n <= 50
board[i][j] 为 ‘M’、‘E’、‘B’ 或数字 ‘1’ 到 ‘8’ 中的一个
click.length == 2
0 <= clickr < m
0 <= clickc < n
board[clickr][clickc] 为 ‘M’ 或 ‘E’
注:E:未挖空 B:已挖空 M:未挖雷 X:已挖雷
在这里插入图片描述

class Solution:
    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
        self.rows=len(board)
        self.cols=len(board[0])
        self.board=board
        self.visited=[[False]*self.cols for _ in range(self.rows)]
        self.dirs=[[-1,0],[1,0],[0,-1],[0,1],[-1,-1],[-1,1],[1,-1],[1,1]]
        #
        if board[click[0]][click[1]]=='M':#如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'
            board[click[0]][click[1]]='X'
        else:
            self.dfs(click[0],click[1])
        return board
        
    def area(self,row,col):
        return 0<=row<self.rows and 0<=col<self.cols
    
    def dfs(self,row,col):
        if not self.area(row,col) or self.board[row][col]!='E' or self.visited[row][col]:
            return 
        #统计雷数
        m_s=0
        for dir in self.dirs:
            nextrow=row+dir[0]
            nextcol=col+dir[1]
            if self.area(nextrow,nextcol) and self.board[nextrow][nextcol]=='M':
                m_s+=1
        #更新board
        if m_s>0:
            self.board[row][col]=str(m_s)#如果一个 至少与一个地雷相邻 的空方块('E')被挖出,修改它为数字('1' 到 '8' ),表示相邻地雷的数量。
        else:
            self.board[row][col]='B'
            #key位置:如果一个 没有相邻地雷 的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的 未挖出 方块都应该被递归地揭露。
            for dir in self.dirs:
                nextrow=row+dir[0]
                nextcol=col+dir[1]
                self.dfs(nextrow,nextcol)

lc 994 :腐烂的橘子
https://leetcode.cn/problems/rotting-oranges/
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j] 仅为 0、1 或 2
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
在这里插入图片描述

#多源BFS
class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        self.dirs = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        self.rows, self.cols = len(grid), len(grid[0])
        self.grid=grid
        #多源
        queue=deque()
        for i in range(self.rows):
            for j in range(self.cols):
                if grid[i][j]==2:
                    queue.append([i,j])
        #
        ans=-1
        while queue:
            for i in range(len(queue)):
                curr=queue.popleft()
                #
                for dir in self.dirs:
                    nextrow,nextcol=curr[0]+dir[0],curr[1]+dir[1]
                    #key
                    if self.area(nextrow,nextcol) and self.grid[nextrow][nextcol]==1:
                        self.grid[nextrow][nextcol]=2
                        queue.append([nextrow,nextcol])
            ans+=1
        #
        for i in range(self.rows):
            for j in range(self.cols):
                if self.grid[i][j]==1:
                    return -1
        return max(ans,0) #[[0]]
    
    
    def area(self,row,col):
        return 0<=row<self.rows and 0<=col<self.cols 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最简单的git图解(git rebase)

今天我们来讲解下git rebase命令&#xff0c;以及git rebase命令与git merge命令的区别。 git rebase图解&#xff1a; 假设我们目前有master、demo两个分支&#xff0c;而且demo分支上从master分支上切出来的&#xff1a; 从上图中可以看到&#xff0c;我们从C2提交点切出来了…

图像边缘检测与图像分割常用算法研究分析-含Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 引言✳️ 一、经典边缘检测算子✳️ 1.1 Roberts 算子与实验验证✳️ 1.2 Sobel 算子原理与实验验证✳️ 1.3 Prewitt 算子与实验验证✳️ 1.4 Log 算子与实验验证✳️ 1.5 Canny 算子与实验验证✳️ 二、图像分割原理及其实验验证✳️ 2.1 基于阈值处理的…

用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (5)- 自定义功能块(下)

AWPLC 目前还处于开发阶段的早期&#xff0c;写这个系列文章的目的&#xff0c;除了用来验证目前所做的工作外&#xff0c;还希望得到大家的指点和反馈。如果您有任何疑问和建议&#xff0c;请在评论区留言。 1. 背景 AWTK 全称 Toolkit AnyWhere&#xff0c;是 ZLG 开发的开源…

logback 集成 logstash

logback 集成 logstash 相关环境参考&#xff1a; Java 输出 JSON 日志 1. 添加依赖 <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.2</version> </depend…

TextRank算法实践

TextRank算法实践 PageRank算法思想 TextRank算法的思想主要源于PageRank算法&#xff0c;PageRank算法主要用于给互联网网页排序&#xff0c;根据网页之间的跳转来构造一个初始权重矩阵&#xff08;转移矩阵&#xff09;&#xff0c;默认每个网页质量都是1 使用一个向量v&…

基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

k8s使用ceph-csi插件的cephfs方式持久化存储

环境说明 操作系统&#xff1a;centos-7.9 x86_64&#xff0c;内核版本3.10.0&#xff0c;所有组件安装均在该操作系统 ceph版本&#xff1a;ceph version 14.2.22 nautilus (stable) kubernetes版本&#xff1a;v1.17.4 ceph-csi版本&#xff1a;v3.0.0 docker版本&#xff1…

【网络安全】红队攻防之基础免杀

引言 本文主要介绍“反射型dll注入”及“柔性加载”技术。 反射型dll注入 为什么需要反射型dll注入 常规的dll注入代码如下&#xff1a; int main(int argc, char *argv[]) { HANDLE processHandle; PVOID remoteBuffer; wchar_t dllPath[] TEXT("C:\\experiments\\…

Go语言学习笔记

1. 普通函数声明/定义 函数声明包括函数名、形式参数列表、返回值列表&#xff08;可省略&#xff09;以及函数体 func 函数名(形式参数列表) (返回值列表){函数体 }2. 接口定义及实现 接口定义&#xff0c;注意和上述函数声明作区分 type 接口名 interface{method1(参数列…

【语音去噪】谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

⛄一、谱减法维纳滤波卡尔曼滤波语音去噪简介 1 维纳滤波算法 在传统的去噪算法中,维纳滤波因其操作简单、去噪效果好,被公认为一种经典的去噪算法。语音信号在时域的表示为: yi( t) si( t) ni( t) ,其中si( t) 、ni( t) 和yi( t) 分别是第i帧原始语音信号、噪声和被噪声污染…

springboot反射执行private方法@Autowired字段为空

springboot反射执行private方法Autowired字段为空描述错误复现controllerserviceReflectServiceImplReflectCallServiceservice 层切面debug 结果图调用 reflectTest 方法(public反射)调用 reflectTest1方法(private反射)分析参考描述 业务代码写完之后&#xff0c;懒得写mock代…

Python基础(四):Python必需掌握基础注释、变量、输出

文章目录 Python必需掌握基础注释、变量、输出 一、注释 1、作用 2、分类及语法 3、快速体验 4、总结 二、变量 1、作用 2、定义变量 三、输出 1、格式化符号 2、体验 3、转义字符 4、结束符 Python必需掌握基础注释、变量、输出 14天学习训练营导师课程&#xf…

[附源码]计算机毕业设计JAVA汽车租赁系统

[附源码]计算机毕业设计JAVA汽车租赁系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

自动化运维CICD

目录 概述 为什么持续集成和发布可以提高效率 如何实现 1、在linux服务器安装部署代码仓库 2、安装jenkins 使用shell脚本实现CICD 使用pipeline实现CICD 使用Blue Ocean实现CICD 概述 持续集成&#xff08;Continuous Integration&#xff0c;CI)和持续发布&#xff0…

C/C++编译器配置——MinGW下载安装

一. 前言 由于重装Win11系统&#xff0c;所有配置环境需要重装&#xff0c;对于C/C编译器MinGW配置做一个简单记录。 VS code等软件只提供编辑器&#xff0c;不提供编译器&#xff0c;因此windows系统上的C/C编译器需要通过安装MinGW实现。 二. 安装过程 在MinGW官网下载安装…

元宇宙产业委风语筑董事长李晖:到更多城市探索元宇宙“虚实结合”

导语&#xff1a;近期李晖和风语筑团队在深度探索“虚实结合”&#xff0c;布局元宇宙&#xff0c;谋求更多的创新。他受中国移动通信联合会元宇宙产业委员会委托&#xff0c;参与研究编撰《元宇宙十大技术》&#xff0c;并为该书做序《元宇宙&#xff1a;数字技术构建美好生活…

(十)延迟队列

延迟队列1. 延迟队列概念2. 延迟队列使用场景3. 整合Springboot4. TTL队列1. 代码架构图2.MQ组件配置文件类代码3. 消息生产者代码4. 消息消费者代码5. 延时队列优化1. 代码架构图2. 配置文件类代码3. 消息生产者代码6. Rabbitmq插件实现延迟队列1.安装延时队列插件2.代码实现7…

强强联合:OpenFeign 整合 Sentinel

书接前文&#xff1a; 微服务间的远程接口调用&#xff1a;OpenFeign 的使用 当项目中使用了 OpenFeign 后&#xff0c;可以很方便的进行远程服务调用&#xff0c;现在有个问题&#xff0c;假如远程服务出现故障了&#xff0c;调不了远程的接口&#xff0c;这边又着急等着返回…

系统启动其实就2个步骤BIOS和MBR(和之后的init/systemd的关系)

1.让计算机知道系统被放在哪个设备上了&#xff08;BIOS&#xff09; 计算机启动先启动bios&#xff0c;再去读MBR&#xff0c;MBR动了才会启动操作系统 2.让计算机知道哪里的分区是活动分区(MBR)&#xff0c;找出来把系统引导到这里来 这两部类似于早先游戏里的红色警报和星…

springcloud20:springcloudalibaba之Nacos

为什么会出现spring alibaba 整个Netflix项目进入维护模式&#xff08;不会添加新功能&#xff09; springcloud: Nerflix:eureka ribbon feign ruul config springcloud一些小技术和其整合 此时内部出问题 SpringCloud 吸收了springcloud alibaba 此时springcloud带了了什么呢…