- 博客(37)
- 收藏
- 关注
原创 Leetcode算法方法总结
只要,就要想到做法。还有一般也会用到双指针,回文串的长度由于可能是奇数也可能是偶数,所以在寻找时,既需要寻找奇数长度的回文串,也需要寻找偶数长度的回文串。
2025-03-27 21:58:30
256
原创 设计模式八股整理
是一种编程习惯,相当于是只有一个工厂,里边集成了很多方法,这样就会造成工厂与实现类之间的耦合,以及抽象接口与工厂之间的耦合,如果要增加新的实现类,那必须修改工厂中的方法。,就是为每一个对象创建一个工厂,实现类要去实现某个方法时,需要去调用对应方法的工厂,让工厂实现创建对象。这样假如需要添加一个方法,只需要重新创建一个对应的工厂即可,与其他方法的实现无关。实现了。如果有的产品需要配合生产时,优先采用抽象工厂,即工厂的工厂。工厂方法模式就是为了实现解耦,Spring底层就使用了工厂方法模式。
2025-03-11 23:36:18
482
原创 JVM虚拟机八股
虚拟机栈是指每个线程运行时所需要的内存,所以也是线程安全的,是一个栈内存,所以是先进后出。每个栈又由多个栈帧组成,对应着每次方法调用时所占用的内存。每个线程只能有一个活动栈帧,对应着正在执行的那个方法。方法区是各个线程共享的一个内存空间,在JDK1.7中,方法区是在堆内存中,即永久代。为了放置堆内存中的内存问题,在1.8之后将方法区放到了本地内存中,叫做元方法区。主要存储的是类的信息和运行时常量池,在虚拟机启动时自动创建,在关闭时自动释放。
2025-03-10 15:37:56
684
原创 Sentinel熔断降级
两个请求A和B,使用关联模式进行流控,对A添加流控规则,选择关联模式,关联的是B,此时当请求B的QPS达到阈值时,就会对A进行限制。Concurrency:并发数,系统同时处理的请求数。TPS:每秒事务数,事务的概念一般大于请求。RT:响应时间,一般取平均响应时间。需要在对应方法上添加注解。
2025-03-10 14:22:06
694
原创 线程相关八股
进程可以简单理解为进行一个程序,比如说我们打开一个浏览器,打开一个文本,这就是开启了一个进程,一个进程想要在计算机中运行,需要将程序交给CPU,将数据存储在内存中,然后还要在内存和磁盘之间进行一些IO。线程就是一条条指令流,将这些指令交给CPU就是在运行该线程。一个进程可以有多个线程。进程就是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务;不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间;线程更轻量,线程上下文切换成本一般比进程要低。
2025-03-03 22:26:13
692
原创 Kafka学习
在某些情况下,消费者组中的消费者消费分区发生变化时,会导致消费者分配不均匀,就会触发消费者组的Renalance机制,进行再均衡。
2025-03-03 01:36:46
2610
原创 Spring框架八股总结
AOP是指面向切面编程,是一种编程思想。是指将那些与业务无关,但是在多个对象中都会使用到的公共行为或逻辑,将其从原来业务代码中抽取出来,并封装为一个模块,这个模块就叫做切面,这样就可以减少重复代码的编写,也降低了模块间的耦合度,同时提高了系统的可维护性。常见的AOP的使用场景:记录日志、缓存处理、Spring中的事务处理。
2025-02-27 12:06:09
494
原创 MySQL八股整理
索引是一种数据结构,可以帮助SQL语句查询时提高查询效率。索引类似于我们一本书籍的目录,通过目录可以快速找到对应的数据。同样,通过索引也可以实现数据的高效查询,尤其是在数据量较大时,往往效果更加明显。聚集索引就是指数据与索引放在一块,在B+树的叶子节点中,存储了整行数据(B+树是InnoDB引擎下索引的数据结构),这样的索引有且只能有一个一般为主键,因为全部数据已经与该索引存储在一起了。
2025-02-26 10:12:55
600
原创 《LeetCode Hot100》 Day01
(4) 如果当前字符是数字,则将multi的值*10再加上当前的数字,乘以10的目的是为了当数字为多位数时,确保正确拼接为一个正确的数字。(2) 如果当前字符是'[',则将当前res存储到特定栈中,并将multi也存储到对应的特定栈中。(3) 如果当前字符是']',则将栈中的res和multi都取出来,其中res重复multi次,添加到一个temp字符串中。// 存储当前解码的结果。// 保存当前解码结果。// 保存当前的重复次数。• // 遇到 '[' 时,先保存当前的重复次数和解码结果。
2025-02-10 23:35:49
816
原创 《代码随想录》Day32打卡!
本题的完整思路如下: 1.本题依然是分为五部曲来进行: 2.第一步:确定dp数组的含义:dp[i]代表爬上第i层阶梯共有多少种不同的方法。2.第二步:确定递推公式:与斐波那契数一样,dp[i] = dp[i-1]+dp[i-2],因为一步可以跨1个或2个阶梯,所以跨到第i个阶梯可以从第i-1个阶梯跨一步到达也可以从i-2跨两个阶梯到达,所以爬到第i个阶梯就有以下几种方式。3.第三步:dp数组如何初始化:dp[1]=0,dp[2]=2. 4.第四步:确定遍历顺序:从小到大依次遍历即可。
2025-01-12 19:48:37
608
原创 《代码随想录》Day31打卡!
2.遍历数组,判断current中的右边界和当前元素的左边界是否有重叠,如果有,则说明是重叠区间,需要合并。3.合并区间:将current的右边界赋值为max(current的右边界和第i个元素的右边界),本题的完整代码如下所示: class Solution { public int merge(int intervals) { // 按区间的起始位置升序排序 Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
2025-01-10 23:44:32
653
1
原创 《代码随想录》Day29打卡!
2.循环,如果当前给的钱是5元,则直接给对应的5元数+1.如果是10元,则判断当前所拥有5元数是否大于0,如果大于0,则5元的数量-1,10元的数量+1.否则,就返回false。如果是20元,则判断5元数量与10元数量是否都大于0,如果大于,则将二者的值都减去1,如果不满足再判断,5元的数量是否大于等于3,如果满足,则5元的数量减去3.否则,就返回false。本题的完整思路如下: 1.本题首先需要根据身高值进行从大到小排序,这样就能保证,在后续调整的时候后边的数移到前边,不会影响排序。
2025-01-08 20:27:56
678
原创 《代码随想录》Day28打卡!
4.此时说明,所有的负数都变为了正数,那么接下来就是对正数取反了,正数取反,对最小的正数取反是可以得到最大的数组和的。所以再对数组进行排序,排序后,对当前的k对2取余,如果是偶数,就不用对数组中的任何一个数做任何变化,直接计算当前数组的和作为结果返回即可。4.如果当前i等于当前所能覆盖的最大区域,那么此时需要跳一次,此时当前点能覆盖的最大区域就是next值,赋值,赋值后判断当前覆盖的最大区域是否能覆盖最后一个点,如果能覆盖,则返回当前步数。//因为跳了一步,所以将下一步可以覆盖的最大区域赋值给当前区域。
2025-01-07 20:32:08
908
原创 《代码随想录》Day27打卡!
本题的完整思路如下: 1.首先讨论当数组为0或者1时,分别返回0和1。2.本题的一个小小难点就是,当当前差值为0时,怎么处理。在判断时,当前插值没有包括为0的情况,所以当当前差值为0时,那么就跳过,不进行任何操作,包括对上一次差值的赋值的操作,这样就可以继续判断接下来的两个差值是否满足摆动序列了。本题是贪心算法的第一道题,贪心算法把握住一个重点:将题分解为两步:什么是局部最优解?这道题将饼干分发给孩子,所以以饼干数组为循环的对象,当当前饼干可以满足当前孩子时,就说明可以满足,结果加1。
2025-01-06 20:18:42
576
原创 《代码随想录》Day25打卡!
本题的完整思路如下: 1.本题与前边的题不一样,前边的题是组合,而该题是排列。组合问题中,引入了一个变量startindex来控制下次遍历时从当前元素的下一个元素开始遍历,而排列问题不是,排列问题需要遍历数组中的所有元素,所以需要引入一个数组来表明哪些元素还没有遍历,直到所有元素都遍历,才结束。如果为false,则进行遍历,回溯。本题的完整思路如下: 1.本题与上一题的区别是该题中的数组元素中存在重复值,所以涉及到去重问题,但是由于将原数组排序后得出的结果与排序前的结果是一样的,因为是排序问题。
2025-01-04 19:06:23
739
原创 《代码随想录》Day24打卡!
本题的完整思路如下: 1.本题使用递归以及回溯来做,所以依然分为三部曲: 2.第一步:确定递归的参数和返回值:无返回值,参数为:原数组,以及startindex。本题的完整思路如下: 1.本题 与上一题相比,多一个去重步骤,因为原数组中有重复元素,如果不去重,结果中会包含一样的结果。3.所以本题的大体步骤跟上一题类似,这里重点展示去重的逻辑: 4.当i>=1时,并且当前元素等于前一个元素时,并且前一个元素没有使用过,即对应的used数组对应位置为false,这样才代表后边的遍历的结果都存在与之重复的元素。
2025-01-03 19:25:18
1547
原创 《代码随想录》Day23打卡!
接着,开始遍历,将对应boolean数组中对应位置的元素变为1,表示已经使用过了。本题的完整思路如下: 1.本题是使用回溯算法,所以分为三步: 2.第一步:首先确定递归的参数和返回值,回溯的返回值一般是空,参数有:原数组,目标值,总和,还有一个数来指导下次遍历从哪里开始遍历。3.第二步:递归的终止条件,即收割结果的条件:当总和等于目标值时,此时将path数组复制到结果数组中,是复制而不是直接添加,因为path是一个全局变量,如果直接添加,path还会随着后边的遍历改变,就不是当前结果了。
2025-01-02 19:01:00
898
原创 《代码随想录》Day22打卡!
本题的完整思路如下: 1.本题使用回溯算法,其实回溯和递归是一样的道理,也是分为三步曲进行: 2.第一步:确定递归函数的返回值和参数:回溯算法的返回值一般都是void,参数一开始不确定可以等写递归逻辑时进行添加。3.第二步:确定递归函数的终止条件:当当前集合中的元素大于目标个数时,则将当前集合添加到结果数组中,返回。4.第三步:确定单次递归函数中的逻辑:需要使用一个参数来控制每次从哪个位置开始,遍历元素,所以在递归函数的参数中添加一个参数来表示每次开始遍历的位置。//第77题. 组合。
2025-01-01 17:20:01
696
原创 《代码随想录》Day21打卡!
本题的完整题目如下:本题的完整思路如下: 1.本题使用递归进行求解,所以分为三部曲: 2.第一步:确定递归函数的参数和返回值:参数是二叉树的节点和要删除节点的范围。所以使用主方法作为递归函数。3.第二步:确定递归的终止条件:当当前节点为空时,返回null 3.第三步:确定单次递归函数的逻辑:当当前节点的值小于下限时,说明当前节点的左子树都不满足要求,所以递归处理当前节点的右子树即可。
2024-12-31 21:57:56
1045
原创 《代码随想录》Day20打卡!
5.第三步:确定递归函数的逻辑:当当前节点的值大于要插入的值时,说明该节点应该插入到当前节点的左子树中,所以让当前节点的左节点等于对当前节点的返回值递归调用的返回值。第四种:就是当前节点的左右子树均不为空时,删除当前节点有两种操作方法:就是将当前节点左节点或者右节点放到当前节点的位置上,一般是将右子树中的节点放到当前节点上:首先找到当前节点的右子树中值最小的节点,因为要将该节点作为右子树的根节点,那么该节点的值要小于右子树中所有节点的值。找到最小值的节点后,将该节点的值赋值给当前节点的值,
2024-12-30 15:42:15
730
2
原创 《代码随想录》Day18打卡!
如果前一个节点为空,则count=1。本题的思路如下: 1.根据二叉搜索树的特性可知,中序遍历得到的是一个有序的数组,所以一个有序数组的最小绝对差就是在相邻两个元素之间产生。其次是处理中间节点:当前一个节点不为null时,计算当前节点和前一个节点的值的差,返回已知最小和当前最小的较小的一个。本题也是使用递归: 2.第一步:确定递归函数的参数和返回值:返回值是节点,参数是二叉树的节点和两个目标节点。4.第三步:确定递归函数中的逻辑:当当前节点为目标节点中的其中一个时,代表着该节点就是祖先,返回当前节点。
2024-12-29 00:17:10
515
原创 《代码随想录》Day17打卡
3.第三步:确定单次递归函数中的逻辑:首先将left的值赋值给maxindex,然后求得当前数组中的最大值的索引值,将该最大值作为新的节点的值传入到树的节点中,然后分别对该节点的左右子树进行构建,构建时需要注意的是传入的参数值,其中构建左子树时,left就是递归时传入的left值,而right值maxindex - 1值。在构建右子树时,传入的left值是maxindex + 1值,而right不变就是调用递归时的值。4.第三步:确定单次递归中的逻辑:以左子树为根基进行合并,当左子树为空时,返回右子树。
2024-12-27 23:23:06
1003
原创 《代码随想录》Day16打卡
本题的完整思路如下: 1.本题目也是使用递归进行计算,所以依然是递归三部曲: 2.第一步:确定递归函数的返回值和参数:返回值是布尔类型的true或false,参数是二叉树节点 3.第二部:确定递归结束的条件:当当前节点为null时,返回false。本题完整思路如下: 1.本题使用递归法,分为三步曲: 2.首先确定递归函数的返回值和参数:参数是二叉树节点,没有返回值,定义两个全局变量,一个记录高度,一个记录值 3.第二部:确定递归的结束条件:当节点为空时,返回。//513.找树左下角的值。
2024-12-26 18:33:53
578
原创 《代码随想录》Day15打卡(今天很多题目没理解,后续需要完善)
本题的完整思路如下: 1.本题的思路需要进一步学习之后完善,现在对二叉树的相关方法不是很理解,尤其是递归。本题也需进一步完善,现在不是很理解!//222.完全二叉树的节点个数。
2024-12-25 22:55:15
313
原创 《代码随想录》Day14打卡!
2.递归法三部曲: 3.第一步:确定递归函数的参数和返回值:参数是二叉树的节点,返回值是二叉树的最小深度。5.第三步:确定单次递归的逻辑:首先对当前节点的左右节点分别进行递归,判断当前节点的左子树是否为空,左子树不为空,右子树为空,则给左子树的深度加1并返回,左子树为空,右子树不为空,则给右子树的深度加1。2.递归三部曲: 3.第一步确定递归的参数和返回值:参数为二叉树的节点,返回值为整数,即二叉树的深度 4.第二步确定递归的终止条件:当该节点为空时,即结束递归,返回0;//104.二叉树的最大深度。
2024-12-24 22:34:33
982
原创 《代码随想录》Day13打卡
递归方法可以按照以下步骤来写: 1.确定递归函数的参数和返回值 2.确定终止条件 3.确定单层递归的逻辑 本题的题目如下: 本题分别使用递归实现前中后序遍历: 前序遍历的思路如下: 1.首先确定递归函数的参数:二叉树的节点以及结果数组,返回值:不需要后续操作,所以没有返回值 2.确定终止条件:当前节点为空时,就结束 3.单层递归的逻辑:前序遍历,需要先将当前节点的值添加到结果数组中,再进行左孩子的遍历,再进行右孩子的遍历。中序遍历,先遍历左子树,再将当前节点的值添加到结果数组中,再进行右孩子的遍历。
2024-12-23 22:39:53
587
原创 《代码随想录》Day11打卡!
本题的思路如下: 1.本题其中一种方法就是:将滑动窗口的数存入到队列中,每次移动窗口时,队首的元素移出去,将新的元素添加到队尾,每移动一次就计算目前队列中的最大值,将其存储在结果数组中。2.第二种方法就是创建一个单调队列,队列中存储的是数组中数的索引值:遍历数组,当队列不为空时,判断队列的队首元素与(i - k + 1)进行对比,如果队首元素小于后者,则说明此时队首的元素应该超出了窗口的大小,则将该元素从队列中移除。//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了。
2024-12-21 23:14:49
846
原创 《代码随想录》Day10打卡!
本题的思路如下: 1.用队列实现栈时就不能像用栈实现队列那样,创建两个队列对象,队列弹出的时候是最先弹出队首的元素,所以像上边那种方法弹出时,会导致两个队列的元素完全一样,无法实现栈的特性。每次添加新元素时,总能至少保证有一个队列是空的,这样到最后就能实现最先添加的元素在队列的队首(栈顶),弹出时,就可以率先弹出。4.队列的peek方法是返回队首元素,所以用栈实现该方法时也是将outStack中的元素使用栈的peek方法返回即可,因为栈的peek方法是返回栈顶的元素。有如下方法:queue.add(x);
2024-12-20 20:07:55
493
原创 《代码随想录》Day09打卡!
3.KMP算法重点是找到模式串的next数组:(1)next数组记录了模式串的各个位置开始的前缀和后缀最大相等字符串的长度;//从hay字符串中依次找与nee字符串第一个字符一样的,如果找到了,再判断hay的下一个字符是否与nee字符串的下一个字符串相等,如果相等就继续往下找,如果不相等,则看hay的下一个是否与ne的第一个相等,依次重复直到找到nee字符串的最后一个字符也相等或者hay所有的字符串都找完结束。最后匹配上的时候,返回当前目标串的索引位置减去模式串的长度就是第一个能匹配上的位置。
2024-12-19 17:54:17
635
原创 《代码随想录》Day08打卡!
本题思路如下: 1.本题较为绕,需要花一点时间看明白 2.首先定义了两个指针,分别记录需要反转的字符串的开始位置和终止位置。4.让i一次性移动2k个长度,并且将i赋值给start指针,其次将start+k-1赋值给end,但是需要将该值与字符串长度-1作比较,取最小的那个值作为end指针的值。本题思路如下: 1.本题较为简单,注意循环的终止条件是一般字符数组的长度,而不是整个字符数组的长度,那样就会让字符数组再次回到原点。本题思路如下: 1.本题较为简单,创建一个新的字符串,遍历旧的字符串。
2024-12-18 20:01:09
454
原创 《代码随想录》Day07打卡
总结: 1.什么时候想到用哈希表:当需要确定一个元素是否出现在一个集合中时,就要想到用哈希表结构。2.哈希表有三种,分别是数组,集合Set,和Map。3.Set是无序的,并且是自动去重的。Map是键值映射的,所以既需要用到值也需要用到索引时,就要想到用Map。数组也是一种哈希表,容易忘记。4.哈希映射,哈希碰撞,哈希碰撞的解决方法:线性探测法和拉链法。
2024-12-17 19:50:33
782
原创 《代码随想录》Day06打卡
2.首先对数组进行循环,判断map集合中是否存在等于(target-该元素)的值,如果存在,则返回键对应的值以及循环的i。3.本题需要注意的是,将数组中的值作为键存放在map集合中,将索引作为值存放在map中。3.对另一个字符串进行循环,获取其每一个字符,判断数组中对应索引处的值是否有值,如有就将其值减去1,若没有则返回false。2.其次,将每一次的数字都存放到一个Set中,如果在下一个数是包含在set中并且不是1,则进入了无限循环,判定为不是快乐数。//用键存放数组中的值,值存放对应的索引。
2024-12-16 23:31:45
894
原创 《代码随想录》Day04打卡
本章节,将虚拟头节点的使用掌握是最重要的,还有就是最后一道题环形链表Ⅱ,要将思想理解,代码就比较简单,具体链表的知识点详见链表基础部分!
2024-12-14 22:14:00
963
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅