- 博客(51)
- 收藏
- 关注
原创 redis八股个人总结
缓存雪崩是指在某个时间点,大量缓存数据同时过期,导致大量请求直接打到数据库上,造成数据库压力骤增,可能引发系统崩溃。缓存穿透是指请求的数据在缓存和数据库中都不存在,这样每次请求都会直接查询数据库,导致对数据库的压力增大。(1) Redis有什么优缺点?Redis是一个基于内存的数据库,读写速度非常快,通常被用作缓存、消息队列、分布式锁和键值存储数据库。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等, Redis 还提供了分布式特性,可以将数据分布在多个节点上,以提高可扩展性和可用性。但是。
2025-03-03 09:43:24
715
原创 黑马点评项目测试总结
4. 设置请求Body: 对于POST请求或者其他需要传递Body的请求,可以在Postman中设置请求的Body。在添加 HTTP 请求时,我们需要填写请求的 URL 和请求参数。在弹出的窗口中,选择请求的类型(GET、POST等),填入请求的URL,选择请求的Header、Body等信息。6. 查看响应: 在发送请求后,可以查看Postman显示的响应信息,包括响应的状态码、响应体等。HTTP 请求是一个发送 HTTP 请求的元素,它可以模拟客户端向服务器发送请求的过程。
2024-12-08 22:13:03
1035
1
原创 45期代码随想录算法营总结
在为期60天的代码随想录训练营结束后,我感慨良多。这段时间不仅让我在编程技能上有了明显的提升,更让我在学习习惯和时间管理上有了深刻的反思和改变。报名参加这个训练营对我来说是一个重要的监督机制。之前我总是拖延,导致上一个学期只学完了Java SE,而这次我认识到,只有在一个有计划的环境中学习,才能更高效地提升自己。通过参加训练营,我感受到了一种紧迫感和责任感。在训练营中,我初次接触了很多算法题,虽然一刷时思路能够理解,但在代码实现上仍显得不够熟练。
2024-11-11 22:41:28
280
原创 Mysql个人八股总结
高效的查询性能:通过较低的树高度和顺序访问,加快数据检索速度。减少磁盘I/O:通过高效的节点结构和缓存利用,降低数据访问成本。支持范围查询:顺序链接的叶子节点使得范围查询变得非常高效。良好的事务处理能力:适合高并发环境,确保数据一致性。Undo Log用于记录事务执行过程中所做的修改,以便在事务发生错误或中止时,可以将数据库状态恢复到修改之前的状态。它主要用于支持事务的原子性和一致性,确保如果事务不能成功完成,所有的修改都会被撤回。Redo Log。
2024-11-11 21:39:37
1147
原创 苍穹外卖架构分析
模块主要定义数据传输对象(DTO)、实体类(Entity)和视图对象(VO),用于数据的管理和传输。: 视图对象,通常用于表示前端所需的数据格式,可以聚合多个 DTO 或实体的数据。: 控制层,接收和处理 HTTP 请求,调用服务层的业务逻辑,并返回响应。: 拦截器,处理请求的预处理和后处理,通常用于权限验证和日志记录。: 自定义注解的定义,用于实现特定功能(如日志记录、权限验证)。: 工具类,提供常用的静态方法,例如字符串处理、日期处理等。: 服务层,处理业务逻辑,调用数据访问层,与数据库交互。
2024-11-07 21:42:52
1169
原创 操作系统个人八股文总结
并发(Concurrency)并发是指多个任务在同一时间段内被处理,虽然它们可能不是同时执行的。并发强调的是任务的结构,允许多个任务在逻辑上交替进行,比如在多核或单核CPU上通过时间片轮转来共享CPU时间。并行(Parallelism)并行是指多个任务在同一时间点上同时执行。并行通常需要多个处理单元(如多核CPU)来支持任务的同时运行。并行强调的是任务的执行效率。用户态(User Mode)用户态是指程序在运行时的基本状态,通常是指用户应用程序的执行环境。
2024-11-07 15:16:52
1270
原创 计算机网络八股文个人总结
特点GET 请求POST 请求主要用途获取数据提交数据数据传输方式URL 查询字符串请求体安全性不适合敏感信息相对安全,但仍需注意幂等性是幂等的非幂等的是否缓存可以缓存通常不缓存在 Web 开发中,缓存是提高性能和用户体验的重要技术。强缓存和协商缓存。下面我们来详细解释这两种缓存及其工作原理。特性HTTP/1.0HTTP/1.1连接管理每个请求新建连接持久连接,复用 TCP 连接带宽优化简单增强,支持分块传输缓存处理。
2024-11-01 17:26:20
1678
2
原创 一道排序题
给你一组数据,国家中文名称,英文名,金牌银牌铜牌,让你写出奖牌榜的输出,规则是先根据总奖牌数,然后金银铜,最后根据国家英文名从a-z降序排列。
2024-10-18 11:13:48
134
原创 代码随想录day38:动态规划part11
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
2024-10-15 02:18:31
383
原创 代码随想录day37:动态规划part10
为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。清晰的展示了二维数组方法。
2024-10-15 01:24:33
228
原创 代码随想录day34:动态规划part7
决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房。然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
2024-10-14 11:06:35
360
原创 代码随想录day32:动态规划part5
就是完全背包min问题,初始化最上边一行为max = amount + 1用与比较。“在前0个数字中,凑出和为0的组合,有几种方法”,我们只能选择放弃“第0个数字”这个遍历顺序与 0-1 背包正好相反。hello算法讲解的很清楚。一维就dp[0] = 1;就行,其实一维的好写,不用考虑遍历边界。第一个做的方案问题一样,改成完全背包的形式,正序遍历。跟上一题的区别就是上一题是组合问题,这次是排列问题。由于当前状态是从左边和上边的状态转移而来的,
2024-10-11 17:01:08
461
原创 代码随想录day31:动态规划part4
题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,。秒啊接下来推导状态转移方程:dp[i][j]的意义是,在前i个数字中,凑出和为j的组合(可以理解成放入A堆),有多少种方法。对于第i个数字,我们有两种选择:1.选择将第i个数字放入A堆,此时,数字还剩i - 1个,背包的容量需要减去nums[i]。递推式为2.选择放弃第i个数字,直接来到第i - 1个数字,背包的容量不变。递推式为dp[i - 1][j];
2024-10-11 15:40:03
970
原创 代码随想录day30:动态规划part3
当i放进去时,那么这时候整个物品集就被分成两部分,1到i-1和第i个,而这是i是确定要放进去的,那么就把j空间里的wi给占据了,只剩下j-wi的空间给前面i-1,那么只要这时候前面i-1在j-wi空间里构造出最大价值,即dp【i-1】【j-wi】,再加上此时放入的i的价值vi,就是dpij了。- 3、第m个的重量小于n,可以放而且真的放了,此时最优解就是第m个物品的价值,加上,m-1个物品时背包容量为(n-第m个物品的重量)的最优解。- 关于dp数组的定义问题,up是先给dp数组,再推递推关系。
2024-10-11 01:53:52
356
原创 代码随想录day29:动态规划part2
的实现中,节点的选择和拆分方式确保了生成的树都是 BST。也可以路径压缩,一维数组压缩到常量,二维数组压缩到一维。没考虑到一个问题,如果第一列的某个单元格是障碍物(所以需要在遇到障碍物后,停止设置后续单元格的值为。),那么该行之后的所有单元格都应该是。自己写的时候写错了第一行的初始化,,因为无法通过障碍物。这个题解是真牛逼,来自。
2024-10-10 21:06:02
367
原创 代码随想录day27:贪心part5
还是与之前的思路差不多,但是需要维护一个start与一个end,因为出循环需要把最后一个加进去,不维护这两个会让i走完。导致错误。
2024-10-10 02:38:23
373
原创 代码随想录day26:贪心part4
如果发现 end=i,那么当前区间合并完毕,把区间长度 end−start+1 加入答案。然后更新 start=i+1 作为下一个区间的左端点。再次遍历 s,由于当前区间必须包含所有 s[i],所以用 last[s[i]] 更新区间右端点 end 的最大值。遍历 s,计算字母 c 在 s 中的最后出现的下标 last[c]。初始化当前正在合并的区间左右端点 start=0, end=0。重复范围问题,维护最小右边界,灵魂是。跟上一题一样,但是优化空间很大。遍历完毕,返回答案。
2024-10-09 23:28:52
322
原创 代码随想录day24:贪心part2
运用前缀和思想,从左到右枚举卖出价格 prices[i],那么要想获得最大利润,我们需要知道第 i 天之前,股票价格的最小值是什么,也就是从 prices[0] 到 prices[i−1] 的最小值,把它作为买入价格,这可以用一个变量 minPrice 维护。请注意,minPrice 维护的是 prices[i] 左侧元素的最小值。由于只能买卖一次,所以在遍历中,维护 prices[i]−minPrice 的最大值,就是答案。from:灵茶山艾府。
2024-10-09 15:23:13
612
原创 代码随想录day23:贪心part1
如果遇到了太多的伤心事(连续和变成负数了),那都是些没有办法改变的事情,我们不如卸下包袱(连续和归0),然后奔赴一个新的起点(新的连续和起点)我们可以一边遍历数组计算前缀和,一边维护前缀和的最小值(相当于股票最低价格),用当前的前缀和(卖出价格)减去前缀和的最小值(买入价格),就得到了以当前元素结尾的子数组和的最大值(利润),用它来更新答案的最大值(最大利润)。三个数一个窗口滑动,一个大一个小为拐,需要注意1.平的时候只加一个,2.头的pre模拟为0,所以头都自动加一,3.尾的自动加体现在res = 1。
2024-10-09 02:26:06
515
原创 代码随想录day22:回溯part4
排列问题是用used数组树枝去重;组合问题(无重复元素)的用startIndex去重,有重复元素的要做数层去重(used数组或者hashset)
2024-10-08 23:12:38
315
原创 代码随想录day21:回溯part3
根据截取出来的字符串判断是否是合理的 ip 段,这里写法比较多,可以先截取,再转换成 int ,再判断。我采用的做法是先转成 int,是合法的 ip 段数值以后,再截取。1、一开始,字符串的长度小于 4 或者大于 12 ,一定不能拼凑出合法的 ip 地址(这一点可以一般化到中间结点的判断中,以产生剪枝行为);2、每一个结点可以选择截取的方法只有 3 种:截 1 位、截 2 位、截 3 位,因此每一个结点可以生长出的分支最多只有 3 条分支;res:记录结果集的变量,常规变量。
2024-10-08 17:38:31
396
原创 代码随想录day20:回溯分割
卡哥 的思路和代码都写出来了,时间问题优化版的还没看,明天 看一下优化版liweiwei的 题解,同是看一下 path的回溯,卡哥代码中。这个比卡哥的好懂,不明白卡哥Java版本代码中sb为什么没回溯,明天探究一下再补充。, etc) – 获得 Collection 对象的大小。的区别,Deque中也是removeLast()自己A了,有几点java获取长度的知识做个总结。, etc) – 获得数组的长度。– 和字符串相关的对象 (
2024-09-20 01:43:53
219
原创 代码随想录day19:回溯
回溯法三部曲事实上,如果 n = 7, k = 4,从 5 开始搜索就已经没有意义了,这是因为:即使把 5 选上,后面的数只有 6 和 7,一共就 3 个候选数,凑不出 4 个数的组合。因此有了优化的剪枝已经选择的元素个数:path.size();所需需要的元素个数为: k - path.size();列表中剩余元素(n-i) >= 所需需要的元素个数(k - path.size())在集合n中至多要从该起始位置 : i <= n - (k - path.size()) + 1,开始遍历。
2024-09-19 10:52:56
334
原创 代码随想录Day18:二叉树完结篇
若 root.val 小于边界值 low,则 root 的左子树必然均小于边界值,我们递归处理 root.right 即可;若 root.val 大于边界值 high,则 root 的右子树必然均大于边界值,我们递归处理 root.left 即可;若 root.val 符合要求,则 root 可被保留,递归处理其左右节点并重新赋值即可。作者:宫水三叶本题思路较为简单,但是左闭右闭区间注意不难写出。
2024-09-18 15:36:26
331
原创 代码随想录Day16:二叉树最近公共祖先
需要用一个pre节点记录一下cur节点的前一个节点。这题我在自己coding的时候有两个坑第一个是我直接new一个pre,这样默认是0 ,如果左一是0,那0 - 0 最小是为0了,所以应该设h设置第一个pre为null。第二个是返回值 问题if (root == null) return res;// 如果节点为空,返回当前最小差值,这里返回0 也可以,由于递归调用是深度优先的,和会在树的每个节点上调用。当遇到空节点时,返回0并不会影响整个递归的逻辑,因为它不会进一步影响res的值。
2024-09-17 17:14:41
1041
原创 代码随想录day15:二叉树递归
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。思路: 中序遍历的顺序正好可以将二叉搜索树转变成递增的顺序,所以中序遍历判断后一个是否比前一个大就可以了。应该写<=,[2 2 2]这样的树不是搜索树。这样不行,不能局部合规,要整体合规。,刚做所以思路哼清晰,a了。
2024-09-14 01:56:26
371
原创 代码随想率Day14:显式回溯与隐式回溯
迭代法自己AC了,每一层取数的开始把第一个数拿出来,到最后一层就是最后一层最左边的。茶大人先右再左的思路太牛了,每次看茶大人的代码都会有一种,优雅永不过时的感觉,太雅了。遍历法没想到思路,看了卡哥的思路。DFS只要是先左就可前序中序都可,后序不行,后序是高度,先左的最大深度叶子结点记录一下,就是最下的一层左的值(因为先左所以是左下)。再来看看隐式 回溯,隐式回溯第一种靠形参位置传参是做加一,在代码中没有进行参数操作,这样回溯回去的参数自然是上一个的。
2024-09-13 23:26:24
1014
原创 java中的显式回溯与隐式回溯思考
其中java是值传递,方法内的int和String之类的因此都是固定的(String是由于别的方法就算改变这个String,也是另外生成一个新的String,int则是值传递),而像ArrayList这些(比如递归回溯时候的path),值传递是一个地址,别的方法改变了,那就要回溯,否则方法栈回溯的时候,方法对应的变量就发生了变化。所以上面的int不需要显式回溯,List需要显式回溯,且List一直在变,所以加入结果集合中必须建立一个目标副本,否则会加入一个空List。回溯的其他思考我是看。
2024-09-13 10:28:54
378
原创 代码随想录day13:二叉树递归
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。对于二叉树的所有路径中的每条路径,当遍历到叶子节点的时候为当前路径的结束。如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0。返回值:以当前传入节点为根节点的树的高度。
2024-09-11 21:55:06
512
原创 代码随想录day12:二叉树递归
前序遍历的递归,程序遍历也可以,将遍历代码处理节点处提取节点改为左右儿子互换就行看了题解,还有灵茶山艾府大人的递归思路,将大问题化为小问题处理,1.递归调用 invertTree(root.left),获取到左子树翻转后的结果 left。2.递归调用 invertTree(root.right),获取到右子树翻转后的结果 right。3.交换左右儿子,即更新 root.left 为 right,更新 root.right 为 left。4.返回 root。
2024-09-10 20:32:15
708
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人