- 博客(32)
- 收藏
- 关注
原创 【SpringCloud】从入门到精通【上】
今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了,虽然在看视频的时候也记了笔记,但是看完之后还是忘得差不多了,所以打算写一篇博客再温习一下内容。
2025-04-08 23:15:29
768
原创 【Linux】虚拟机设置静态IP
主播我今天下午学了几节微服务课,上课的时候,直接把手机拿走了去上课(电脑连的我手机的热点),虚拟机没关,晚上主播我回来继续学,电脑连上热点之后,发现虚拟机连接不上了,一看IP,妈的IP从变到了,当时看到这个我直接要被气死,微服务的每个模块mysql地址都是写死的,而且用docker部署nacos和seata连接mysql的地址也是写死的,这样一来好多地方都要变,而且说不好第二天IP又会发生改变,所以这次我决定狠下心,把虚拟机设置为静态IP这个技术学会。
2025-04-07 23:21:24
216
原创 【从0到1学MybatisPlus】MybatisPlus入门
为了简化单表CRUD,MybatisPlus提供了一个基础的BaseMapper接口,其中已经实现了单表的CRUD:因此我们自定义的Mapper只要实现了这个BaseMapper,就无需自己实现单表CRUD了。这种写法在某些企业也是不允许的,因为SQL语句最好都维护在持久层,而不是业务层。就当前案例来说,由于条件是in语句,只能将SQL写在Mapper.xml文件,利用foreach来生成动态SQL。这实在是太麻烦了。假如查询条件更复杂,动态SQL的编写也会更加复杂。
2025-04-07 12:59:39
814
原创 【从0到1学RabbitMQ】RabbitMQ基础篇
/ 消费者@Component@Slf4jlog.info("消费者收到了消息{}" , msg);从代码我们可以看到其实很简单,我们只需要把类作为Bean对象管理,然后再方法中添加注解,指定监听的队列是哪个,就可以进行监听// 发送者@Autowired@Test发送消息也是非常简单,指定发送的队列(这里入门没有指定交换机),然后向队列中发送消息,监听着就可以监听到对应的消息。
2025-04-06 21:23:51
940
原创 【力扣刷题|第十九天】二分+贪心 最长递增子序列
从这里我们可以看出当我们把g[i]定义为长为i+1的递增序列的的末尾元素的最小值的时候,才能更方便的更新后面元素,我们每次遍历的时候,要么更新一个位置,要么增加一个位置。更新或增加的位置是第一个大于等于nums[i]的数的下标。这道题我们依旧可以先用子集型回溯的思想来结题,有两种做法。我们对动态规划类型的问题进行优化,交换状态与状态值。同时我们对递归式子一比一翻译的得到递推式子。所以我们可以得出递归式子。这两个式子的前提条件都是。
2025-04-05 12:14:05
185
原创 【力扣刷题|第十八天】最长公共子序列 编辑距离
改为一维数组,这里看二维数组的递推式子骂我们需要的是,上面,左面和左上的值,和上题一样需要记录左上的值,但这道题我们需要在第二个循环开始的时候初始化一维数组最左边的值,这里我们需要先记录上一次循环一维数组最左边的值,在初始化这次循环一维数组最左边的值。简化为一维数组,我们发现计算当前位置的时候,我么需要知道这个位置左边的值,上面的值和左上的值,但是每次的计算结果就会覆盖掉左上的值,那该怎么办呢。的时候是否需要考虑都不选的情况,如下图,只选择一个的情况,在。的初始化值,这里初始化的值和上面边界条件一样。
2025-04-01 23:16:19
399
原创 【从0到1学Docker】Docker学习笔记
前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?
2025-03-31 13:00:37
937
1
原创 【力扣刷题|第十七天】0-1 背包 完全背包
这道题需要我只有在00的地方初始化为0,其他地方初始化为int的最大值,但是在java中这样会越界,主播我初始化为20000,这样在最后如果找不到符合的,那么f[n][amount]的值就是我们初始化的值。接下来我们用递推的方式来做也就是用循环和二维数组来代替递归,这道题的初始化也需要我们讨论,我们只需要初始化0 0处为1,因为背包容量为0的时候0个物品有1种添加方式,也就是不放物品。即选择的正数个数为偶数,而且N+T也为偶数,那么第一个判断条件我们就有了,并且问题可以转换为,背包容量为。
2025-03-29 23:54:07
308
原创 【力扣刷题|第十六天】动态规划-打家劫舍
但是这样写,我们会通过不了,因为超时了,这是因为回溯的时间复杂度是指数级别的,那么我们该如何优化呢,我们看如下图,dfs(2)被选择了两次而且他们的结果也是一样的,那么我们第一次计算dfs(2)的时候就放入缓存当中,然后第二次再算的时候就从缓存当中取。这道题我们可以先把这道题看成回溯问题,例如我们从最后一个房子来看,选最后一个房子,那么问题就变成在剩下的n-2个房子考虑选或者不选的问题,不选最后一个房子,那么问题变为在剩下的n-1个房子当中选或者不选的问题,代码如下。
2025-03-25 13:06:02
292
原创 【力扣刷题|第十五天】回溯问题-排列型回溯
第二种方法,我们想,如果当前点的对角线已经被选择过了,那么与它相同的r-c的值和r+c的值是不是一定在这之前出现过。这道题我们看如下图,先选择1,2,3,然后再继续选择,那么我们如何判断当前选择的数字是否选择过呢,我们有两种做法,第一种就是传递一个集合,里面记录了可以选择的数字,每次选择完一个数字以后就在集合里删去。第二种做法就是,我们可以定义一个初始值全为false的布尔类型的数组,当选择了一个数,我们记录这个数在nums当中的下标,然后,将数组下标这个位置的值变为true,下面我们看代码,
2025-03-23 11:09:11
309
原创 【力扣刷题|第十四天】回溯问题-组合型回溯
这个题和上一题差不多,我们只需要在增加一个剪枝条件,就是target目标值是否小于零或者它大于剩下的要递归的数中从最大的数开始到剩下要递归的数的个数这几个数的值,就比如现在目标值是10,剩下的数是5,4,3,2,剩下要递归两个数,但是5+4小于10,所以后面的直接不进行递归。我们可以对该题的递归进行剪枝,我们从大到小开始递归,如果递归到的数字小于要剩下递归的个数。这个题我们可以用选与不选的角度来写,先选择。那么说明当前递归的数不够就不要继续递归。的个数,如果不大于选择。
2025-03-21 09:45:56
257
原创 【力扣刷题|第十三天】回溯问题-子集型回溯
这里我们可以选择当前元素选择或者不选择,站在输入的角度,每个数可以选择或者不选择,这个题我们需要注意,最后需要清空path当中的所有元素,也就是恢复现场,上一题不用恢复现场是因为,上一题是覆盖,而这一题并不能用覆盖,因为其中的选择与不选择你无法用其他数字代替,如果不填你还需要记录那一次没选。这题我们可以站在答案的角度思考,最后我们等到分割完了才进行添加。枚举完第i个之后就一要枚举第i+1个。
2025-03-18 12:44:52
274
原创 【黑马点评|项目】万字总结(下)
优惠卷秒杀接口单体项目下一人多单的情况线程1查询库存,发现库存充足,创建订单,然后准备对库存进行扣减,但此时线程2和线程3也进行查询,同样发现库存充足,然后线程1执行完扣减操作后,库存变为了0,线程2和线程3同样完成了库存扣减操作,最终导致库存变成了负数!这就是超卖问题的完整流程那么我们该如何有效防止超卖问题的发生呢,以下提供几种常见的解决方案首先我们要为 tb_seckill_voucher 表新增一个版本号字段 version ,线程1查询完库存,在进行库存扣减操作的同时将版本号+1,线程2
2025-03-15 23:33:37
886
原创 【黑马点评|项目】万字总结(上)
昨天终于是把大名鼎鼎的Redis实战项目黑马点评写完了,刚写完回顾前面的知识发现忘得差不多了,今天写个笔记回顾一下。黑马点评百度网盘,提取码:eh11缓存就是数据交换的缓冲区(称作Cache [ kæʃ ] ),是存贮数据的临时地方,一般读写性能较高。如果不使用缓存我们每次就会去数据库查询信息,但是有一些信息是一直不变的,我们频繁去数据库查询会大大降低数据库的性能。
2025-03-15 18:11:02
931
原创 【从0到1学Redis】Redis基础篇
KEYS:查看符合模板的所有key,可以使用通配符*(不建议在生产环境设备上使用)DEL:删除一个指定的key,返回值为一个integer类型的值,表示删除的数量EXISTS:判断key是否存在,返回值为一个integer类型的值,表示存在的数量EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除TTL:查看一个KEY的剩余有效期,返回值为一个integer类型的值,-1表示永久有效,-2表示不存在或失效,其它表示存活的秒数。
2025-03-15 10:38:25
739
原创 【力扣刷题|第十二天】二叉树的层序遍历
这道题我们依旧可以使用第一个题的方法,层序遍历,然后返回最左边的那个数 ,但是这样速度太慢,我们看另一种方法,还是使用队列,这次我们先添加右子树,再添加左子树,那么当我们从队列当中取节点的时候,最先出来的就是右节点,那么我们只需要返回队列当中最后一个节点的值就可以。这个题我们可以使用队列的方式来进行层序遍历,先用一个队列存储根节点,然后一直循环,先获取队列中的节点的值,然后将队列中节点的左右节点存入队列,然后继续遍历。
2025-03-14 16:50:08
280
原创 【力扣刷题|第十一天】二叉树两个节点的共同祖先
首先我们来看,如果当前节点是空节点的时候,我们直接返回空节点就好了,如果当前节点是P,那么我们就不需要再继续往下遍历了,因为如果q节点在下面,那么最大公共祖先就是p,如果q在另一棵树上那么公共祖先也不在下面,所以就不需要继续遍历了,q是当前节点同理。如果左右字数多到了,那么说明,祖先节点是当前节点,如果左子树没找到,那么说明祖先节点在右子树,返回右子树递归结果。右子树没找到同理,左右子树都没有找到,那么就返回空节点。这个题我们可以分四种情况,如下图。这个题我们可以分四种情况,如下图。
2025-03-12 23:10:45
149
原创 【力扣刷题|第十天】二叉树前中后序遍历
例如下面这个二叉树,我们先遍历左子树,然后遍历右子树,我们可以得到一个严格递增的数组,1,2,3,4,5,6.那这样我们就可以用中序遍历来判断是否是一个二叉搜索树,只需要让当前节点和上一个节点的值作对比,看当前节点的值是否小于上一个节点的值即可.这道题我们可以用前序遍历的思想,把下一个节点需要满足的范围传递下去,然后进行比较,这个题主问题就是判断是否是二叉搜索树,子问题和这个问题是相似,可以使用递归的思想。
2025-03-11 09:44:22
281
原创 【力扣刷题|第九天】二叉树与递归
这道题我们可以用第一题的做法,先找出这个节点左节点的深度和右节点的深度,判断左右节点是否相差1,那么如果在递归过程中发现不平衡我们该返回什么呢,我们可以返回-1,这样如果返回发现了不平衡的节点,就会层层返回上去,如果父节点得到了-1,那么就不再递归。这道题需要判断两个数是否完全相同,也就是这两个数上节点的结构相同,并且节点上的数也相同,对于一个节点,我们判断时候相同,需要判断节点的值是否相投,节点的左子树和右子树是否和另一个节点相同,原问题和子问题相似。
2025-03-08 23:08:08
312
原创 【力扣刷题|第八天】删除链表节点
但是这里我们并不知道被删除节点的上一个节点是什么,这时候我们就要动脑思考,我们让被删除的节点的值等于下一个节点的值,让被删除节点的下一个节点等于被删除节点的下一个节点的下一个节点,是不是也和删除这个节点的效果一样呢,答案是肯定的。这里我们想,要删除这个节点,是不是需要找到删除的这个节点的上一个节点,我们先让快指针走n步,然后再让慢指针开始走,当快指针的下一个节点为null的时候停止,这时候我们会发现,快慢指针之间的步数总是相差n,那么慢指针指向的位置就是被删除位置的前一个节点。返回 已排序的链表。
2025-03-05 20:53:31
426
原创 【SpringMVC】源码解读-执行流程
这里我们看到,它通过遍历处理链当中的拦截器集合,执行拦截器当中的preHandle方法,如果所有都返回true,那么拦截器下标就会是拦截器个数-1,如果其中一个返回了false,就会去执行triggerAfterCompletion方法,也就是执行已经执行过的拦截器的AfterCompletion方法。的类,在上面,我们说过,这个类,其实就是保存了Controller的BeanName和请求路径对应的类中的方法。这个方法最终简化后,也就是执行这个方法,点进去之后我们会发现这是一个空的方法,但是。
2025-03-05 12:56:27
839
原创 【力扣刷题|第七天】环形链表
这个题我们可以使用快门指针的方法,慢指针每次走一个节点,快指针每次走两个节点,如果节点的个数是奇数如上示例,当快节点走到最后一个节点的时候,慢指针走到中间节点,当节点个数是偶数的时候,如下图快指针走到null的时候,慢指针走到中间的第二个节点符合题意。为什么相遇的时候慢指针不会走完一圈呢,我们来假设到最坏的情况,当慢指针刚进入环的时候,快指针刚好在慢指针前面,快指针相对慢指针的速度为1,那么快指针最少要走环长-1 才能与慢指针相遇。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。
2025-03-01 23:26:10
913
原创 【力扣刷题|第六天】链表-反转链表
这时候我们就可以在一开始的时候定义一个哨兵节点,哨兵节点的下一个节点就是head,然后我们进行循环将p0指向left前的一个节点,然后后面的思路跟上题一样。这个题主要考察的是对单链表的反转,我们从头节点来看,1反转之后指向空,2指向1,以此类推,这时候我们就可以定义一个pre为空,cur指向1,然后让1下一个数指向空,然后移动pre和cur,这时候我们会发现移动的时候找不到下一个数是什么,这时候我们就需要在移动钱定义一个next变量记录下一个数,然后一直循环,直到cur为null。
2025-02-27 21:21:36
278
原创 【力扣刷题|第五天】二分法训练
那么数组最后一个数一定在蓝色区域,然后我们对剩下的n-1个数进行二分查找法查找规定left=0 right=n-2 mid始终为 right + left / 2,我们这时候就可以判断mid位置和mid+1位置的大小,如果mid的位置的数大于mid+1位置的数,那说明mid+1在峰值的右边那么mid+1右边的数都在峰值的右边所以此时将right左移,相反left右移,最终会将数组划分为左红右蓝的区域,而且left-1一定指向红色区域right+1一定指向蓝色区域那么left指向的数就一定是峰值。
2025-02-24 23:27:20
816
1
原创 【力扣刷题|第三天】滑动窗口
这个题目我们可以以最左边的数为起点开始枚举,依次向右扩展,每次加新枚举的数,但是加完之后我们先不用老老实实的尽行继续扩展,而是我们可以保留此次计算出来的数的和删除最左边的那个数是否大于等于目标值,直到小于目标值为止,这样我们就可以精确的计算出最小的那个数组,然后每一次枚举中比较数组长度的最小值,比较完之后就可以获取的最小长度。解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。我们运用上题滑块思想同理也可以做这道题。
2025-02-20 22:35:29
464
原创 【力扣刷题|第二天】盛水最多的容器
这道题目我们依旧可以用双指针法,我们首先确定左指针为0,右指针为n-1,这时候我们就可以计算出这两个竖线的面积,用变量存储起来,然后我们可以判断,左竖线的长度和右竖线的长度,如果左竖线比右竖线短,那么我们就可以移动左竖线,然后继续进入循环计算出面积然后与上一次计算出的结果进行比较,得出这两次结果的最大面积然后保存起来,如果右竖线比左竖线短,同理。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
2025-02-20 12:36:27
269
原创 【Spring】Bean对象和SpringBoot原理
默认情况下Spring项目启动的时候,会把bean都创建好放到IOC容器当中,Spring也提供了一些方法来让我们获取到bean对象。都生成一个默认的bean对象,如果用户自己定义了这个类型的bean,就是用自己定义的,如果他没有定义还想使用就是用默认的。第一种方法就是我们在启动类上重写@ComponentScan 加上我们的包所在的位置,让其扫描我们的包。但是当我们导入第三方依赖的时候,并不可能自己手动的这样一个一个导入,那么第三方依赖会为我们提供。那么我们想,我们引入的第三方依赖是怎么自动配置的呢。
2025-02-18 22:48:45
1128
原创 【力扣刷题|第一天】两数之和II和三数之和,双指针法
如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length。我们注意到这个数组是已经拍好序的 我们可以首尾相加,例如2+8 他是大于目标值9的,如果我们把2的指针向右挪一位,则变成3那么首尾想加的数更大,所以我们需要挪动大数的指针使其变小。那么答案就很明显了。返回 [1, 2]。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]
2025-02-17 23:09:38
739
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人