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

【LeetCode刷题笔记】双指针

剑指 Offer 21.调整数组顺序使奇数位于偶数前面

解题思路:
  • 对撞指针 从左边不停的找第一个偶数,从右边不停的找第一个奇数 ,找到后 交换 两者位置

本题与【905. 按奇偶排序数组】几乎雷同。

剑指 Offer 57.和为s的两个数字

本题与【167. 两数之和 II - 输入有序数组】相同

解题思路:
  • 1) 对撞指针 ,计算  sum(L + R)  的和,判断与  target  的关系,来决定移动左指针还是右指针
  • 2) 二分查找 ,先固定一个  nums[i] ,然后到剩余数组 [ i+1...end ] 中二分查找  target = s - nums[i]  的值
  • 注意:题目数组是 递增排序 好的,所以才能用上面两种方法,并且只要找到一个解即可返回。

 

26.删除有序数组中的重复项

解题思路:
  • 1) 快慢指针 slow 指向 已处理区域 最后一个位置 fast 指向 未处理区域 第一个位置 初始 slow = 0, fast = 1,不断向后移动 fast
  • fast 的值跟 slow 的值 不等 ,就让 slow++ ,把 fast 处的值放到 slow 位置,最后返回 slow + 1  作为 数组长度 。 
  • 注意:本题能这样做的原因是因为题目的数组是 升序排列 的。

 

这种算法是不断比较未处理区域的值和已处理区域的最后一个值,由于数组是升序排列的,所以只需要跳过那些与已处理区域最后一个相同的值即可。然后只将不同的值往前面放。 

 

解题思路: 
  • 2) 快慢指针 slow 指向 已处理区域 下一个位置 fast 指向 未处理区域 第一个位置 初始 slow = 1, fast = 1 不断向后移动 fast
  • fast 的值跟 fast-1 不同时,就把 fast 处的值放到 slow 位置,然后 slow++ 最后返回 slow 作为 数组长度 。 
  • 注意:本题能这样做的原因是因为题目的数组是 升序排列 的。

 

这种算法是不断比较未处理区域的当前值和上一个值,由于数组是升序排列的,所以只需要跳过那些与上一个相同的值即可。然后只将不同的值往前面放。 

问题:为什么 slow fast 要从 1 位置开始呢?

这是因为 slow 的含义是已处理区域的下一个位置,初始时,前面预留的 0 位置表示该位置默认是已经被处理的区域,即 1 个数字本身是不重复的,所以 slow 从 0 位置的下一个位置开始。而 1 位置表示未处理的第一个位置,所以 fast 1 位置开始。在方法 1 中 slow 从 开始的含义也是一样的,表示此时 0 位置是已处理的最后一个位置(同时也是已处理的第一个位置)。

80. 删除有序数组中的重复项 II

 

解题思路:
  • 类似26, slow 指向 已处理区间 下一个位置,   slow 前面 预留两个空位 ,  slow、fast 从第 3 个元素开始,即初始 slow = 2, fast = 2 ,   不断向后移动 fast
  • fast slow - 2 位置的元素不同,就把 fast 处的值放到 slow 的位置,然后 slow++ 最后返回 slow 作为数组长度。
  • 注意:本题能这样做的原因是因为题目的数组是 有序排列 的。

 

 

这里之所以前面预留2个空位,是因为题目要求重复元素只出现2次,因此如果前两个元素重复也没有关系,如果前两个元素不同,更没有问题。

还有一个问题是为什么跟 fast 比较的是 slow - 2 位置的数呢?

如果 fast slow - 2 相同,而 slow - 2 又可能与 slow - 1 相同,那么就有可能出现三个相同的数: nums[fast] == nums[slow - 2] == nums[slow - 1],此时重复元素出现次数 > 2 了,因此 fast 必须跟 slow - 2 保持不同,这样重复元素最多出现 2 次。

那如果 fast slow - 1 比较不同时就赋值,这样行不行呢?如下图所示,这样会完美的错过后面所有重复数字的答案(重复的2和3只保留了一个)

 

287. 寻找重复数

解题思路:
  • 1)快慢指针,存在重复数字的数组会形成环,类似141环形链表, 环的入口处即重复元素
  • 将题目给的数组当作 一个数组形式的链表 来看待,数组的下标就是指向元素的指针,把数组的元素也看作指针。
  • 例如 0 是指针,指向 nums[0] ,而 nums[0] 也是指针,指向 nums[nums[0]]
  • slow fast 初始为 0 ,然后 slow 走一步, fast 走两步,如果 slow 追上 fast 就退出循环, 此时让 slow = 0 回到开头,然后 slow fast 同步走,如果 slow 追上 fast , 则相遇点就是重复数字。 

看一下为什么题目给定的存在重复数字的数组会形成环: 

如上图所示:我们使用函数 f(x) = nums[x] 来建立一个数列:x,nums[x],nums[nums[x]], nums[nums[nums[x]]]...... 即每一个数的位置是前一个数的值,如果我们从 x=nums[0] 开始,又因为 nums 里有一个重复的数字,这必将形成一个带有循环的数列。

更复杂的例子/更大的圈:

我们不难看出,进入循环的点就是我们要找的重复的数字(即上面两个例子里的 1 和 9),问题是如何找到它?答案就是使用快慢指针

解题思路: 
  • 2) 二分查找 在  [1, n] 数字区间上二分, 对于 mid = (L + R) / 2 ,重复的数要么落在 [L, mid]  要么落在 [mid + 1, R]
  • 每次二分后统计数组中 ≤ mid  的元素的个数 count ,然后根据 count 和  mid  的大小关系来决定接下来到哪边去二分:
  • ① 如果 count ≤ mid ,说明左边没有重复,收缩左边界 L = mid + 1 ,到右半边区间 [mid + 1, R] 查找;
  • ② 如果 count  >  mid ,说明 [L, mid] 内出现了重复元素, 收缩 R mid - 1 ,到左半边区间 [L, mid - 1] 继续查找,但是此时需要用变量 res 记录一下移出的 mid 值,因为它可能是潜在的重复元素。最后返回 res 即可。

为什么二分时要统计 ≤ mid 的元素个数呢?

简单的来说就是一个萝卜一个坑,mid 及左侧最多有 mid 个坑(如果包含1~n连续不重复的话),如果出现了重复元素,就可能超过 mid 个坑。 

我们考虑一个 cnt 数组,cnt[i] 表示 nums 中小于等于 i 的元素个数,如下图:

假设nums数组无重复的情况下,显然 cnt[i] ≤ nums[i],也就是说 ≤ mid 的数量不会超过mid,例如上图中 ≤ 3 的数量最多就是 3 个,但是如果数组中有 1 个重复元素的情况下,就不一定能满足这个条件了:

显然这是因为出现了重复数字导致的。 

虽然题目数组是无序的,但是cnt数组是逐步增大且具有单调性的,此题的二分思想就是利用cnt数组的特性来判断区间划分的。

解题思路: 
  • 3) 位运算 统计 nums 中所有人的二进制在第 i 位上 1 的个数和记为 x , 统计 [1-n] 中所有人的二进制在 i 位上 1 个数和记为  y ,如果 x > y , 则说明重复的数在第 i 位上二进制是 1 ,因此才会多出来  个数。我们只需将 32 位二进制位中 1 的个数多出的那一位的答案二进制位设置为  即可。

 

这个代码如果想更极致一点,可以先找出最大数 n 中最高位的 1 的位置,循环只需要处理到这一位即可,因为再高的就全是 0 了。参考代码:

27. 移除元素

 

解题思路:
  • 1) 快慢指针 ,快慢指针从 0 开始,不断移动 快指针 ,把 快指针 遇到的 不等于 val 的值移动到 慢指针 的位置。

这个做法可以看到是利用原始数组本身来作为结果数组接收答案。 

解题思路: 

  • 2) 对撞指针 ,当  L 指针 遇到要删除的元素  val  时,使用数组最后一个元素来覆盖这个元素,并且让 R--
  • 覆盖后的  处新数字有可能仍是要删除的元素,没有关系,在下一次 while 循环会接着判断处理,但是至少,我们从数组的最后删除了一个元素。
  •   L 指针 遇到的元素不是  val  时,让 L++
  • while  循环条件是 L<=R ,因为每个数都要处理,最后返回 作为数组长度。

283. 移动零

解题思路:
  • 1) 快慢指针 ,快慢指针从 0 开始,不断移动快指针,当 快指针 遇到的 非 0 数字 时, 交换快慢指针的元素即可。
  • 2)   快慢指针 ,快慢指针从 0 开始,不断移动快指针, 快指针 遇到的 非 0 数字 时, 直接覆盖到前面 slow 位置,然后 slow++ 。全部结束后,再把 slow 之后的位置都置为  0
  • 3) 快慢指针 ,针对方法 2)优化: fast 遇到 非0 值覆盖到 slow 后,如果 fast 不等于 slow 就将 fast 直接原地置 0 ,然后再 slow++

 

 

202. 快乐数

解题思路:
  • 1) 哈希检测环 ,使用 HashSet 来判断重复,每次 while 循环判断只要  n != 1  并且也没包含在 set 中,就将  n  并加入 set 集合中,然后将 n 更新为 n 的各位数的平方和。
  • 结束循环后返回 n 是否等于 1 即可(跳出循环只有两种情况要么 n 变成 1 要么 set 集合中出现了重复即有环)。
  • 求  num  各位的平方和的技巧:每次  num % 10  取出个位数,然后计算平方累加到结果中, num / 10  去掉个位数,直到  num  变成  停止。 

虽然这道题在 LeetCode 上标记为 [简单] 难度,但是我觉得有一种情况是比较难观察出来的,那就是题目中说的除了最终得到 1 以外,最终也可以变成无限循环,这里的无限循环有可能是最终又遇到了重复的数字,也有可能是变得越来越大直到无穷大一直进行下去。也就是说可能会有两种情况,而在很多网课中讲解的这里仅仅只是默认按照重复数字套哈希表的解法。

下面看一下力扣官方的解释:

我们可以先举几个例子。我们从7开始。则下一个数字是49(因为72=49),然后下一个数字是97(因为42+92=97)。我们可以不断重复该的过程,直到我们得到1。因为我们得到了1,我们知道7是一个快乐数,函数应该返回 true

 

再举一个例子,让我们从 116  开始。通过反复通过平方和计算下一个数字,我们最终得到 58 ,再继续计算之后,我们又回到 58。由于我们回到了一个已经计算过的数字,可以知道有一个循环,因此不可能达到 1。所以对于 116,函数应该返回 false。 

 

根据我们的探索,我们猜测会有以下三种可能:

    1.最终会得到 1。

    2.最终会进入循环。

    3.值会越来越大,最后接近无穷大。

第三个情况比较难以检测和处理。我们怎么知道它会继续变大,而不是最终得到 1 呢?我们可以仔细想一想,每一位数的最大数字的下一位数是多少。

 

对于 3 位数的数字,它不可能大于 243。这意味着它要么被困在 243 以下的循环内,要么跌到 1。4 位或 4 位以上的数字在每一步都会丢失一位,直到降到 3 位为止。所以我们知道,最坏的情况下,算法可能会在 243 以下的所有数字上循环,然后回到它已经到过的一个循环或者回到 1。但它不会无限期地进行下去,所以我们排除第三种选择。

即使在代码中你不需要处理第三种情况,你仍然需要理解为什么它永远不会发生,这样你就可以证明为什么你不需要处理它。

解题思路: 
  • 2) 快慢指针检测环 ,慢指针和快指针初始值从 n 开始,在每次循环中,慢指针计算更新 1 次( slow 更新为其各位平方和),而快指针计算更新 2 fast 更新为其各位平方和) ,直到出现 快指针 变为 1 ,或者 快指针 慢指针 相遇,就退出循环。
  • 最后返回 快指针是否等于1 即可(如果是因为快慢指针相等退出循环的,说明存在环)。
  • 注意: 快指针 会先遇到 1

注意上面代码中,最好使用 do-while 循环,不然可能上来就退出循环了,因为 slow fast 都初始化为 n  ,当然由于前面已经分析了要么最终会变成1,要么会出现环(重复),所以你也可以直接写一个 while(true) 死循环来检测,在循环体里面写判断退出的条件。

快慢指针是用来检测有环问题的经典做法。

881. 救生艇

解题思路:
  • 1) 排序 + 对撞指针 ,要求船数最少,那就应该尽可能多的坐满  人一船,剩下的人一人坐一船,因此 先排序 ,然后对撞指针从两头往中间挑选两个人的体重之和 <=limit 的坐一船,如果两个人的体重超过 limit ,只能较重的那个人自己坐一船
  • 循环结束时,如果  L == R ,则剩余的 1 人自己坐一船。 (注意退出循环也有可能是因为 L > R,所以最后返回时需要判断一下)
解题思路: 
  • 2) 排序 + 中心扩展, 也是需要 先排序 ,然后从 右往左 找到第一个 <= limit / 2 的位置,然后从该位置开始设双指针往 左右 同时 扩展 寻找能够两个人坐一船的,剩下落单的人只能一人一船。
  • 特判1:如果每一个人的体重都超过了限重的一半( > limit / 2 ),那么只能一人坐一船,直接返回 people.length ,不用再继续了。因为此时任意两人体重之和都会超过 limit
  • 特判2:如果最重的人体重 <= limit / 2 ,则此时任意两人组合体重和都不会超过 limit ,所以此时可直接安排 2 人坐一船,直接返回 (people.length + 1) / 2

 

中心扩展法计算稍显麻烦,相对来说,本题还是方法 1)对撞指针更加容易理解,代码也更加简单。

 

相关文章:

【LeetCode刷题笔记】双指针

剑指 Offer 21.调整数组顺序使奇数位于偶数前面 解题思路&#xff1a; 对撞指针 &#xff0c; 从左边不停的找第一个偶数&#xff0c;从右边不停的找第一个奇数 &#xff0c;找到后 交换 两者位置 本题与【905. 按奇偶排序数组】几乎雷同。 剑指 Offer 57.和为s的两个数字 本题…...

互联网Java工程师面试题·Memcached 篇·第二弹

目录 10、memcached 如何实现冗余机制&#xff1f; 11、memcached 如何处理容错的&#xff1f; 12、如何将 memcached 中 item 批量导入导出&#xff1f; 13、如果缓存数据在导出导入之间过期了&#xff0c;您又怎么处理这些数据呢&#xff1f; 14、memcached 是如何做身份…...

特斯拉被称为自动驾驶领域的苹果

特斯拉的自动驾驶技术无疑是居于世界上领先地位的,有人形容特斯拉是自动驾驶汽车领域的苹果。特斯拉发布的Tesla Vision系统只配备了摄像头,不依靠雷达。 这并不是特斯拉唯一和其它对手不同的地方,他们的整个战略都是基于车队和销售产品,而其大多数竞争对手则销售自…...

stm32之HAL库操作PAJ75620

一、模块简介 手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输&#xff0c;本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势&#xff0c;包括 右&#xff1a;编码为 0x01左&#xff1a;编码为 0x0…...

医学影像归档与通讯系统(PACS)系统源码 PACS三维图像后处理技术

医学影像归档与通讯系统&#xff08;PACS&#xff09;系统源码 PACS三维图像处理 医学影像归档与通讯系统&#xff08;PACS&#xff09;系统&#xff0c;是一套适用于从单一影像设备到放射科室、到全院级别等各种应用规模的医学影像归档与通讯系统。PACS集患者登记、图像采集、…...

web漏洞-PHP反序列化

目录 PHP反序列化序列化反序列化原理涉及技术利用危害CTF靶场 PHP反序列化 序列化 将对象转换成字符串 反序列化 相反&#xff0c;将字符串转换成对象。 数据格式的转换对象的序列化有利于对象的保存和传输&#xff0c;也可以让多个文件共享对象。 原理 未对用户输入的序列化字…...

Redis-分布式锁

分布式锁相关内容 超卖问题切入可以使用互斥锁给先获取到锁的线程加锁吗&#xff1f;使用redis分布式锁解决超卖问题setnx命令实现分布式锁为什么需要设置过期时间&#xff1f;Redis实现分布式锁如何合理控制锁的有效时长 redisson实现分布式锁 超卖问题切入 我们先来看一个项目…...

什么时候使用继承,好莱坞原则(设计模式与开发实践 P11+)

文章目录 好莱坞原则真的需要继承吗&#xff1f; 好莱坞原则 如果你熟悉继承方法、乃至模板方法模式后&#xff0c;就可以了解一个设计原则 好莱坞原则 新人演员把简历发给好莱坞&#xff0c;许久之后没有回应不耐烦打电话给好莱坞&#xff0c;只收到回应&#xff1a;不要来找…...

蓝桥等考Python组别十四级001

第一部分&#xff1a;选择题 1、Python L14 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 d {A: 501, B: 602, C: 703, D: 804} print(d[B]) 501602703804 正确答案&#xff1a;B 2、Python L14 &#xff08;15分…...

TI单芯片毫米波雷达代码走读(二十七)—— 角度维(3D)处理之通道间幅相一致性补偿

TI单芯片毫米波雷达1642代码走读(〇)——总纲 书接上回,我们知晓了3D处理的主要流程,相信大家都已理解基本的原理。在正式进行数据分析之前还有一步关键的步骤需要说明,即通道间的幅相一致性补偿问题。 细心的朋友可能注意到,在3D处理的的原码中有两个函数我一直没有讲:…...

数据结构 2.2 单循环链表

2.单循环链表 data|next——>data|next——>data|next——>头节点 1.初始化链表 2.增加节点&#xff08;头插法、尾插法&#xff09; 3.删除节点 4.遍历链表 定义一个结构体&#xff0c;存放data域和指针域&#xff1a; typedef struct Node {//定义一个结构体&…...

矩阵距离——多源BFS

给定一个 N 行 M 列的 01 矩阵 A&#xff0c;A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为&#xff1a; dist(A[i][j],A[k][l])|i−k||j−l| 输出一个 N 行 M 列的整数矩阵 B&#xff0c;其中&#xff1a;B[i][j]min1≤x≤N,1≤y≤M,A[x][y]1dist(A[i][j],A[x][y]) 输入格式 第…...

关于在 Notion 中使用 Markdown 语法

关于在 Notion 中使用 Markdown 语法 习惯使用的 Markdown 的伙伴们应该知道&#xff0c;当需要加粗字体时&#xff0c;会首先输入 ** **&#xff0c;然后在里面填内容。 但是在 Notion 中&#xff0c;这个就不太行了。它所定义的规则是从前往后&#xff0c;也就是先键入**&…...

sigmoid和softmax函数有什么区别

Sigmoid函数和Softmax函数都是常用的激活函数&#xff0c;但它们的主要区别在于应用场景和输出结果的性质。 Sigmoid函数&#xff08;也称为 Logistic函数&#xff09;&#xff1a; Sigmoid函数将输入值映射到0到1之间的连续实数范围&#xff0c;通常用于二元分类问题。 Si…...

第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第七节 - Python 中使用 % 进行字符串格式化)

在Python中,可以通过不同的方法来实现对字符串所需的格式化。他们之中有一些是; 1) 使用 % 2) 使用 {} 3)使用模板字符串本文讨论使用 % 进行格式化。使用 % 的格式类似于 C 编程语言中的“printf”。%d – 整数 %f – 浮点数 %s – 字符串 %x – 十六进制 %o – 八进制 下面的…...

【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)

一&#xff0c;VMware下载地址&#xff1a; 百度网盘链接链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https:/…...

Eclipse MAT解析headp dump,total size小于file size

1. 问题描述 使用Eclipse MAT分析20GB的heap dump文件 最后解析出来dump size只有1GB 2. 原因&#xff1a;heap dump中包含许多unreachable objects Eclipse MAT的官方文档&#xff0c;《Basic Tutorial》章节&#xff0c;有对上图的Overview page做介绍 针对total size小…...

【数据挖掘】2022年 Quiz 1-3 整理 带答案

目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1 (50%). Consider the set of training data shown below. Here, A, B, C C C are attributes, and D D...

AcWing 288. 休息时间,《算法竞赛进阶指南》,环形与后效性处理

288. 休息时间 - AcWing题库 在某个星球上&#xff0c;一天由 N 个小时构成&#xff0c;我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时&#xff0c;以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛&#xff0c;它每天要休息 B 个小…...

一文掌握Linux系统信息查看命令(CPU、内存、进程、网口、磁盘、硬件)

引言 大家好&#xff0c;欢迎来到我的技术博客&#xff01;如果你是一名Linux系统管理员、开发者或者热衷于学习Linux系统的用户&#xff0c;那么你一定需要掌握查看系统信息的命令。在这篇博客中&#xff0c;我将为你介绍一些常用的Linux命令&#xff0c;帮助你快速了解和监控…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...