20240319-图论

图论练习题目

      • 拓扑排序
        • 深度优先搜索方法
        • 广度优先搜索方法
      • 无向无权图
      • 无向有权图
      • 有向无权图 利用广度优先搜索算法
      • 有向有权图 带排序的广度优先算法/dijkstra
      • 最小生成树
        • prims算法
        • Kruskal's Algorithm
      • 最小割 min-cut
      • 二分图 Bipartite Graph 队列
      • 例题1 所有可能的路径
      • 例题2 岛屿数量
      • 例题3 岛屿最大面积
      • 例题4 飞地的数量
      • 例题5 被围绕的区域
      • 例题6 太平洋大西洋水流问题
      • 例题7 钥匙和房间
      • 例题8 寻找图中是否存在路径
      • 例题9 冗余连接
      • 例题10 课程表 拓扑排序
      • 例题11 单词接龙
      • 例题12 最小高度树
      • 例题13 省份数量

dfs采用的是栈,bfs采用的是队列。
sorted(L.items(),key=lambda x:(x[0],x[1],x[2],x[3]))

拓扑排序

在这里插入图片描述

深度优先搜索方法
import collections
graph = {
    'A':['F','E','C'],
    'B':['A','C'],
    'C':[],
    'D':['F'],
    'E':[],
    'F':['E','G'],
    'G':['F']
}
n=len(graph)
visted={key:0 for key in graph.keys()}
ans=[]
def dfs(u):
    if visted[u]==2:
        return
    visted[u]=1
    for v in graph[u]:
        if visted[v]==0:
            dfs(v)
            
    visted[u]=2
    ans.append(u)
for key in graph.keys():
    dfs(key)
print(ans)
# ['E', 'G', 'F', 'C', 'A', 'B', 'D']

广度优先搜索方法
import collections
graph = {
    'A':['F','E','C'],
    'B':['A','C'],
    'C':[],
    'D':['F'],
    'E':[],
    'F':['E','G'],
    'G':['F']
}
n=len(graph)
visted={key:0 for key in graph.keys()}
queue=[]
ans=[]
def bfs(u):
    if visted[u]:return
    queue.append(u)
    visted[u]=1
    while queue:
        node=queue.pop(0)
        ans.append(node)
        for v in graph[node]:
            if visted[v]==0:
                visted[v]=1
                queue.append(v)
                
                
for key in graph.keys():
    bfs(key)
# bfs('A')
# print(ans,visted)
# bfs('B')
# print(ans,visted)
# ['E', 'G', 'F', 'C', 'A', 'B', 'D']
print(ans)
# ['A', 'F', 'E', 'C', 'G', 'B', 'D']

无向无权图

graph={
    1:[2,5],
    2:[1,3,4],
    3:[2],
    4:[2],
    5:[1,6],
    6:[5,7],
    7:[6]
}
n=len(graph)+1
# visted=[0]*n
visted=[0, 0, 0, 0, 0, 0, 0,0]
def dfs(u):
    ans=1
    visted[u]=1
    for v in graph[u]:
        if visted[v]==0:
            vh=dfs(v)
#             print(u,v,vh)
            ans=max(ans,vh+1)
    return ans

dfs(2) #5

无向有权图

有向无权图 利用广度优先搜索算法

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

graph={
    1:[2,4],
    2:[4,5],
    3:[1,6],
    4:[3,5,6,7],
    5:[7],
    6:[],
    7:[6],
}
def shortest(root,graph):
    n=len(graph)+1
    path=[0]*n
    visit=[0]*n
    dist=[float('inf')]*n
    queue=[root]
    visit[root]=1
    dist[root]=0
    while queue:
        ver=queue.pop()
        for nex in graph[ver]:
            if visit[nex]==0:
                path[nex]=ver
                visit[nex]=1
                dist[nex]=dist[ver]+1
                queue.append(nex)
    print(dist,path,visit)
                
shortest(3,graph)

有向有权图 带排序的广度优先算法/dijkstra

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

import heapq
graph1={
    1:[(2,2),(1,4)],
    2:[(3,4),(10,5)],
    3:[(4,1),(5,6)],
    4:[(2,3),(2,5),(8,6),(4,7)],
    5:[(1,7)],
    6:[],
    7:[(1,6)],
}
def shortest2(root,graph):
    n=len(graph)+1
    path=[0]*n
    visit=[0]*n
    dist=[float('inf')]*n
    
    dist[root]=0
    queue=[(0,root)]
    heapq.heapify(queue)
    while queue:
        dis,ver=heapq.heappop(queue)
        visit[ver]=1
        for nex in graph[ver]:
            if visit[nex[1]]==0:
                heapq.heappush(queue,nex)
                if dist[ver]+nex[0]<dist[nex[1]]:
                    dist[nex[1]]=dist[ver]+nex[0]
                    path[nex[1]]=ver
    print(dist,path,visit)
    
shortest2(3,graph1)
#[inf, 4, 6, 0, 5, 7, 5, 8] [0, 3, 1, 0, 1, 4, 3, 5] [0, 1, 1, 1, 1, 1, 1, 1]

最小生成树

prims算法

树是连通 无向 无环图。n个结点一定有n-1条边。
一个普通的生成树
在这里插入图片描述
最小生成树
在这里插入图片描述

Kruskal’s Algorithm

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

graph=[
    [3,1,4],[3,4,2],[3,6,5],[1,4,1],[4,6,8],[1,2,2],[6,7,1],[2,4,3],[4,7,4],[2,5,10],[5,7,6],[4,5,7]
]
def kruskal(graph,n):
    find=[i for i in range(n+1)]
    graph.sort(key=lambda x:x[2])
    def parent(x):
        if find[x]==x:
            return x
        else:
            return find[x]
    
    ans=[]
    while len(ans)<n-1:
        x,y,w = graph.pop(0)
        if parent(x)!=parent(y):
            ans.append([x,y,w])
            find[x]=y
    return ans
    
kruskal(graph,7)    
# [[1, 4, 1], [6, 7, 1], [3, 4, 2], [1, 2, 2], [2, 4, 3], [3, 1, 4]]

最小割 min-cut

二分图 Bipartite Graph 队列

例题1 所有可能的路径

https://leetcode.cn/problems/all-paths-from-source-to-target/description/

class Solution:
    def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
        path = [0]
        ans=[]

        def dfs(graph,index):
            if index==len(graph)-1:
                ans.append(path[:])
                return 
            for node in graph[index]:
                path.append(node)
                dfs(graph,node)
                path.pop()
        dfs(graph,0)
        return ans
class Solution:
    def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
        from collections import deque
        ans=[]
        q=deque([[0],])
        while q:
            path = q.popleft()
            if path[-1]==len(graph)-1:
                ans.append(path)
                continue
            for v in graph[path[-1]]:
                q.append(path+[v])
        return ans 

例题2 岛屿数量

https://leetcode.cn/problems/number-of-islands/description/

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        n=len(grid)
        m=len(grid[0])
        ans=0

        def wipe(x,y):
            dir=[
            lambda x,y:[x+1,y],#下
            lambda x,y:[x-1,y],#上
            lambda x,y:[x,y+1],#右
            lambda x,y:[x,y-1],#左
            ]
            stack=[(x,y)]
            while stack:
                x,y=stack.pop()
                grid[x][y]='0'
                for i in range(4):
                    nxt_x,nxt_y=dir[i](x,y)
                    if nxt_x>=0 and nxt_x <n and nxt_y<m and nxt_y>=0:
                        if grid[nxt_x][nxt_y]=='1':
                            stack.append((nxt_x,nxt_y))
                        
        for i in range(n):
            for j in range(m):
                if grid[i][j]=='1':
                    ans+=1
                    wipe(i,j)
        return ans

例题3 岛屿最大面积

https://leetcode.cn/problems/max-area-of-island/

class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        n=len(grid)
        m=len(grid[0])
        ans=0
        for i in range(n):
            for j in range(m):
                if grid[i][j]==1:
                    grid[i][j]=0
                    tmp=1
                    stack=[(i,j)]
                    dir=[
                    lambda x,y:[x+1,y],
                    lambda x,y:[x-1,y],
                    lambda x,y:[x,y+1],
                    lambda x,y:[x,y-1],
                    ]
                    while stack:
                        x,y=stack.pop()
                        grid[x][y]=0
                        for k in range(4):
                            nx,ny = dir[k](x,y)
                            if nx>=0 and nx<n and ny>=0 and ny<m and grid[nx][ny]==1:
                                tmp+=1
                                grid[nx][ny]=0
                                stack.append((nx,ny))
                    ans = max(ans,tmp)
        return ans

例题4 飞地的数量

https://leetcode.cn/problems/number-of-enclaves/

class Solution:
    def numEnclaves(self, grid: List[List[int]]) -> int:
        n=len(grid)
        m=len(grid[0])
        ans=0
        def dfs(x,y):
            for dx,dy in (0,1),(1,0),(-1,0),(0,-1):
                nx = x+dx
                ny =y+dy
                if 0<= nx <n and 0<= ny <m and grid[nx][ny]==1:
                    grid[nx][ny]=0
                    dfs(nx,ny)

        for i in [0,n-1] :
            for j in range(m):
                if grid[i][j]==1:
                    ans+=1
                    grid[i][j]=0
                    dfs(i,j)


        for i in range(n):
            for j in [0,m-1]:
                if grid[i][j]==1:
                    ans+=1
                    grid[i][j]=0
                    dfs(i,j)
        return sum(sum(g) for g in grid)
class Solution {
    public static int[][] dirs={{-1,0},{1,0},{0,1},{0,-1}};
    private int n,m;
    private boolean[][] visted;

    public int numEnclaves(int[][] grid) {
        n = grid.length;
        m=grid[0].length;
        visted = new boolean[n][m];
        for(int i=0;i<n;i++){
            dfs(grid,i,0);
            dfs(grid,i,m-1);
        }
        for(int j=0;j<m;j++){
            dfs(grid,0,j);
            dfs(grid,n-1,j);
        }
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j =0;j<m;j++){
                if(grid[i][j]==1 && !visted[i][j]){
                    ans+=1;
                }
            }
        }
        return ans;
    }

    public void dfs(int[][]grid,int x,int y){
        if (x<0 || x>=n || y<0 || y>=m || grid[x][y]==0 || visted[x][y]){
            return;
        }
        visted[x][y]=true;
        for(int[] dir:dirs){
            dfs(grid,x+dir[0],y+dir[1]);
        }
    }
}

例题5 被围绕的区域

https://leetcode.cn/problems/surrounded-regions/description/

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        n=len(board)
        m=len(board[0])
        visted=[[0]*m for _ in range(n)]

        def dfs(x,y):
            if 0<=x<n and 0<=y<m and board[x][y]=='O' and not visted[x][y]:
                visted[x][y]=1
                for dx,dy in (0,1),(0,-1),(1,0),(-1,0):
                    dfs(x+dx,y+dy)
            else:
                return

        for i in range(n):
            dfs(i,0)
            dfs(i,m-1)

        for j in range(m):
            dfs(0,j)
            dfs(n-1,j)
        
        for i in range(n):
            for j in range(m):
                if board[i][j]=='O' and visted[i][j]==0 :
                    board[i][j]='X'

例题6 太平洋大西洋水流问题

https://leetcode.cn/problems/pacific-atlantic-water-flow/description/

class Solution:
    def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
        n=len(heights)
        m=len(heights[0])
        pacific =[[0]*m for _ in range(n)]
        atlantic=[[0]*m for _ in range(n)]
        ans=[]
        def dfs(x,y,grid):
                grid[x][y]=1
                for dx,dy in (0,1),(0,-1),(1,0),(-1,0):
                    nx=x+dx
                    ny=y+dy
                    if 0<=nx<n and 0<=ny<m and heights[nx][ny]>=heights[x][y] and grid[nx][ny]==0:
                        dfs(nx,ny,grid)

        for i in range(n):
            for j in range(m):
                if j==0 or i==0:
                    dfs(i,j,pacific)
                if i==n-1 or j==m-1:
                    atlantic[i][j]=1
                    dfs(i,j,atlantic)
        for i in range(n):
            for j in range(m):
                if pacific[i][j]==1 and atlantic[i][j]==1:
                    ans.append([i,j])
        return ans

例题7 钥匙和房间

https://leetcode.cn/problems/keys-and-rooms/

class Solution:
    def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
        n=len(rooms)
        visted=[0]*n
        def dfs(x):
            if visted[x]:
                return
            visted[x]=1
            for nx in rooms[x]:
                dfs(nx)

        dfs(0)
        return sum(visted)==n

例题8 寻找图中是否存在路径

https://leetcode.cn/problems/find-if-path-exists-in-graph/description/

class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
            parent=[i for i in range(n)]
            def find(x):
                if x==parent[x]:
                    return x
                parent[x]=find(parent[x])
                return find(parent[x])
            def union(x,y):
                px=find(x)
                py=find(y)
                if px!=py:
                    parent[px]=py

            for u,v in edges:
                if find(u)!=find(v):
                    union(u,v)
            return find(source)==find(destination)

例题9 冗余连接

https://leetcode.cn/problems/redundant-connection/description/

class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        n=len(edges)
        parent=[i for i in range(n+1)]
        def find(x):
            if x==parent[x]:
                return x
            parent[x]=find(parent[x])
            return find(parent[x])
        def union(x,y):
            px=find(x)
            py=find(y)
            if px !=py:
                parent[px]=py
        for u,v in edges:
            if find(u)==find(v):
                return [u,v]
            else:
                union(u,v)

例题10 课程表 拓扑排序

https://leetcode.cn/problems/course-schedule/description/

import collections
class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        edges=collections.defaultdict(list)
        visted=[0]*numCourses
        restult=[]
        valid = True
        for u,v in prerequisites:
            edges[v].append(u)
        
        def dfs(u):
            nonlocal valid
            visted[u]=1
            for v in edges[u]:
                if visted[v]==0:
                    dfs(v)
                    if not valid:
                        return
                elif visted[v]==1:
                    valid=False
                    return
            visted[u]=2
            restult.append(u)

        for i in range(numCourses):
            if valid and not visted[i]:
                dfs(i)
        return valid
import collections
class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        edges=collections.defaultdict(list)
        indeg=[0]*numCourses

        for u,v in prerequisites:
            edges[v].append(u)
            indeg[u]+=1
        
        queue = [u for u in range(numCourses) if indeg[u]==0]
        visted =0
        while queue:
            u = queue.pop(0)
            visted+=1
            for v in edges[u]:
                indeg[v]-=1
                if indeg[v]==0:
                    queue.append(v)

        return visted==numCourses

例题11 单词接龙

https://leetcode.cn/problems/word-ladder/description/

class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        wordList = set(wordList)
        if endWord not in wordList:
            return 0
        q = deque([(beginWord, 1)])
        while q:
            cur, step = q.popleft()
            for i, x in enumerate(cur):
                for y in [chr(ord('a')+i) for i in range(26)]:
                    if y != x:
                        nxt = cur[:i] + y + cur[i+1:]
                        if nxt == endWord:
                            return step + 1
                        if nxt in wordList:
                            wordList.remove(nxt)
                            q.append((nxt, step+1))
        return 0

例题12 最小高度树

https://leetcode.cn/problems/minimum-height-trees/description/

import collections
class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        graph=collections.defaultdict(list)
        res=[]
        for u,v in edges:
            graph[u].append(v)
            graph[v].append(u)
        
        def dfs(u):
            ans=1
            visted[u]=1
            for v in graph[u]:
                if visted[v]==0:
                    vh=dfs(v)
        #             print(u,v,vh)
                    ans=max(ans,vh+1)
            return ans

        visted=[0]*n
        res.append([0,dfs(0)])
        for i in range(1,n):
            visted=[0]*n
            tmp=dfs(i)
            if tmp<res[-1][-1]:
                res=[[i,tmp]]
            elif tmp==res[-1][-1]:
                res.append([i,tmp])


        return [u for u,v in res]

例题13 省份数量

https://leetcode.cn/problems/number-of-provinces/description/
1.利用并查集

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        n=len(isConnected)
        par=[i for i in range(n+1)]
        def find(x):
            if x==par[x]:
                return x
            par[x]=find(par[x])
            return find(par[x])

        for i in range(n):
            for j in range(n):
                if i!=j and isConnected[i][j]==1:
                    pi=find(i+1)
                    pj= find(j+1)
                    par[pi]=pj
        for i in range(n+1):
            par[i]=find(i)
        return len(set(par))-1
class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        n=len(isConnected)
        visted=[0]*n
        ans=0
        def dfs(x):
            visted[x]=1
            for j in range(n):
                if isConnected[x][j]==1 and visted[j]==0:
                    dfs(j)

        for i in range(n):
            if visted[i]==0:
                dfs(i)
                ans+=1
        return ans

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 教程系列之Redis 集群配置(十三)

1.Redis集群方案比较 主从模式 在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。…

【计算机网络_网络层】IP协议

文章目录 1. IP的基本概念1.1 什么是IP协议1.2 为什么要有IP协议 2. IP的协议格式3. 网段划分&#xff08;重要&#xff09;3.1 为什么要进行网段划分3.2 网段划分的规则3.2.1 古老的划分方案3.2.2 现代的划分方案 4. 特殊的IP地址5. 解决IP地址的数量限制问题6. 私有IP和公网I…

RecyclerView notifyItemRemoved 之后的源码分析

源码版本&#xff1a;androidx1.3.2 分析场景&#xff1a; RecyclerView使用线性布局&#xff0c;方向为竖直方向&#xff0c;布局从上到下&#xff0c;宽高都是 MATCH_PARENT。开始有3条数据。然后移除 position 1 的数据。 流程图 先说下结论&#xff1a; 在 dispatchL…

24. UE5 RPG制作属性面板(二)

在上一篇中&#xff0c;我们创建属性面板的大部分样式&#xff0c;这一篇里面接着制作。 在这一篇里我们需要有以下几个方面&#xff1a; 在界面增加一个属性按钮。属性按钮增加事件&#xff0c;点击时可以打开属性面板&#xff0c;属性面板打开时无法再次点击按钮。点击属性面…

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么&#xff1f;在计算机体系中扮演什么角色&#xff1f; 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

动态规划Dynamic Programming

上篇文章我们简单入门了动态规划&#xff08;一般都是简单的上楼梯&#xff0c;分析数据等问题&#xff09;点我跳转&#xff0c;今天给大家带来的是路径问题&#xff0c;相对于上一篇在一维中摸爬滚打&#xff0c;这次就要上升到二维解决问题&#xff0c;但都用的是动态规划思…

STM32微控制器中,如何处理多个同时触发的中断请求?

在STM32微控制器中&#xff0c;处理多个同时触发的中断请求需要一个明确的中断优先级策略&#xff0c;以确保关键任务能够及时得到响应。STM32的中断控制器&#xff08;NVIC&#xff09;支持优先级分组&#xff0c;允许开发者为不同的中断设置抢占优先级和子优先级。本文将详细…

Matlab|【免费】智能配电网的双时间尺度随机优化调度

目录 1 主要内容 基础模型 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序为文章《Two-Timescale Stochastic Dispatch of Smart Distribution Grids》的源代码&#xff0c;主要做的是主动配电网的双时间尺度随机优化调度&#xff0c;该模型考虑配电网的高效和安…

JAVA面向对象编程 JAVA语言入门基础

类与对象的概念 类 (Class) 和对象 (Object) 是面向对象程序设计方法中最核心的概念。 类是对某一类事物的描述(共性)&#xff0c;是抽象的、概念上的定义&#xff1b;而对象则是实际存在的属该类事物的具体的个体&#xff08;个性&#xff09;&#xff0c;因而也称为实例(In…

网络协议栈--传输层--UDP/TCP协议

目录 本节重点一、再谈端口号1.1 再谈端口号1.2 端口号范围划分1.3 认识知名端口号(Well-Know Port Number)1.4 回答两个问题1.5 netstat1.6 pidof 二、UDP协议2.1 UDP协议段格式2.2 UDP的特点2.3 面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议2.7 UDP…

知攻善防应急靶场-Linux(2)

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全应急响应和知攻善防实验室靶场&#xff0c;记录自己的学习过程&am…

JAVA学习笔记20(面向对象编程)

1.3 方法递归调用 ​ *阶乘 public int factorial(int n) {if(n 1){return 1;}else{return factorial(n-1)*n;} }1.递归重要规则 1.执行一个方法时&#xff0c;就创建一个新的受保护的独立空间&#xff08;栈空间&#xff09; 2.方法的局部变量是独立的&#xff0c;不会相互…

反序列化漏洞简单知识

目录&#xff1a; 一、概念&#xff1a; 二、反序列化漏洞原因 三、序列化漏洞的魔术方法&#xff1a; 四、反序列化漏洞防御&#xff1a; 一、概念&#xff1a; 序列化&#xff1a; Web服务器将HttpSession对象保存到文件系统或数据库中&#xff0c;需要采用序列化的…

Cobalt Strike -- 各种beacon

今天来讲一下cs里面的beacon 其实cs真的功能很强大&#xff0c;自带代理创建&#xff0c;自带beacon通信&#xff01;&#xff01;&#xff01; 一张图&#xff0c;就能说明beacon的工作原理 1.Beacon 每当有一台机器上线之后&#xff0c;我们都会选择sleep时间&#xff0c;…

代码随想录算法训练营Day56 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离

647. 回文子串 dp[i][j]表示第i位开始&#xff0c;第j位结束的字符串是否为回文串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1…

Redis 教程系列之Redis PHP 使用 Redis(十二)

PHP 使用 Redis 安装 开始在 PHP 中使用 Redis 前&#xff0c; 我们需要确保已经安装了 redis 服务及 PHP redis 驱动&#xff0c;且你的机器上能正常使用 PHP。 接下来让我们安装 PHP redis 驱动&#xff1a;下载地址为:https://github.com/phpredis/phpredis/releases。 P…

Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

垂直起降机场:飞行基础设施的未来是绿色的

电动垂直起降&#xff08;eVTOL&#xff09;飞机的日益发展为建立一个新的网络来支持它们提供了理由&#xff0c;这将推动开发绿色基础设施新模式的机会。这些电气化的“短途”客运和货运飞机通常被描述为飞行汽车&#xff0c;是区域飞行和城市出租车的未来&#xff0c;有可能提…

为什么 Hashtable 不允许插入 null 键 和 null 值?

1、典型回答 浅层次的来回答这个问题的答案是&#xff0c;JDK 源码不支持 Hashtable 插入 value 值为 null&#xff0c;如以下JDK 源码所示&#xff1a; 也就是JDK 源码规定了&#xff0c;如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常 并目看上面的JDK 源码可…

2024全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台

2024全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88948076 更多资源下载&#xff1a;关注我。