自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

alike_meng的博客

记录我走过的路

  • 博客(339)
  • 收藏
  • 关注

原创 常见设计模式简介

定义一个工厂接口,让子类去决定具体创建哪种产品产品接口A+具体产品实现产品接口A抽象类工厂B,里面的抽象方法是创建产品+具体工厂继承工厂B,创建产品的方法里按照想要创建的产品来new对象客户端使用 工厂B=具体工厂,工厂B.创建产品,产品.具体方法。也就是直接用工厂就能创建出不同的产品,只需要直接new的时候是new哪个具体工厂就行解耦客户端和具体产品易于扩展新产品、和工厂差不多,只是上面是一个产品,这里是一族产品。通过抽象工厂接口动态创建同一产品族的一整套产品。注意工厂,在工厂方法中用的抽象类,在抽象工

2026-03-30 20:34:16 423

原创 简单搜推链路的简单解析

随着召回策略的丰富,候选集往往达到数千量级,而精排模型(如DIN、MMoE)结构复杂、特征繁多,全量计算会导致系统延迟不可接受。它是推荐链路的最后一道工序,确保最终呈现给用户的内容,既符合算法预测的“高兴趣”,又满足平台运营的“硬约束”。,防止用户只看到自己狭窄兴趣圈里的东西(信息茧房),同时满足新用户(没有历史行为)的推荐需求。:强制打散同类目内容,确保列表里有“吃的、穿的、用的”,丰富用户视野,避免审美疲劳。:获取用户当前的经纬度,筛选出物理距离在一定范围内(如3公里、5公里)的物品。

2026-03-24 21:10:39 376

原创 spring的几个八股

三级缓存的前提是先实例化再注入,构造器注入是实例化时就要注入,A 还没 new 出来就需要 B,放不进三级缓存,直接报错。A 依赖 B,B 依赖 A,如果没有缓存机制,创建 A 时发现需要 B,去创建 B 时又发现需要 A,死锁了。:多个 Bean 依赖 A 时,每次调用工厂生成一个新代理,B 和 C 拿到的不是同一个对象,不一致。:B 拿到原始 A,最终容器里放的是代理 A,B 持有的引用和容器里的不是同一个对象,不一致。B 从二级缓存拿到原始A,注入进去,B 完成初始化。

2026-03-21 00:52:19 320

原创 redis与数据库的一致性问题分析

但是延迟双删也会有不一致的情况,其实和先删缓存再更新数据库是一样的。这个方式对于先更新数据库再删除缓存的补丁在于:如果是数据库是读写分离主从复制的架构的话,写线程写的是主库,读线程读的是从库,而主从复制是需要时间的。读写线程并发可能会有问题(核心问题读线程是先把老的值读出来,然后写线程删除完缓存之后,读线程再把老的值写进去。基于这种情况,最后还是只使用先更新数据库再删缓存的方式用的多。这个方式对于先删除缓存再更新数据库的补丁在于:B线程将缓存更新为旧值了,A线程睡一会之后将这个旧值再次删掉了。

2026-03-20 13:52:36 330

原创 junit mokito写法

【代码】junit mokito写法。

2025-07-23 12:39:03 174

原创 堆排序Java

【代码】堆排序Java。

2025-03-06 11:34:43 177 1

原创 归并排序Java

【代码】归并排序Java。

2025-03-06 11:33:59 134

原创 main“java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0

main"java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0的错误。3.将winutils/hadoop/bin里的hadoop.dll 这个文件放到C: windows\System32。将 winutils.exe 放置在 C:\hadoop\bin 目录下。在 Path 环境变量中添加 C:\hadoop\bin。HADOOP_HOME:指向 C:\hadoop。

2025-02-22 15:34:22 400

原创 币安面经(4)

区块链基础共识机制:你能描述常见的区块链共识机制(例如工作量证明和权益证明)吗?它们各自的优点和缺点是什么?是哈希表的核心组件。)中的一个索引(

2025-01-20 10:58:29 980

原创 币安面经(3)

​ 有什么难度,是什么架构,如果中间有什么是面试官熟的会问很深的细节,我面的这个面试官估计是做cosmos的,问了cosmos提案的作用和hub的作用。2.btc生态熟吗?ordinals有了解吗?brc20基于什么判断账户余额,要转一笔铭文需要怎么操作。sol的铭文和brc20有什么差别。要用单调栈,这部分我也不太会。大概模拟了一下这个答案。3.寿司代码,经典反转链表。1.在别的交易所写的业务。在牛客上找了题目描述。

2025-01-17 11:24:43 1127

原创 币安面经(2)

线程池核心参数 线程池怎么关闭超过keepalived 的线程?选择分区数量和消费者数量时,需要根据业务需求和吞吐量合理设计,以实现负载均衡和高效消费。你们分库分表怎么做的?MySQL索引,聚集索引和非聚集索引?具体讲讲叶子节点存储的具体区别?一个分区只能被一个消费者线程消费,而一个消费者可以消费多个分区。使用负载均衡器(如 Nginx)分配请求,避免某一节点过载。异步任务处理,尤其是复杂路由规则的任务分发。rocketmq和kafka的选型 区别?需要快速响应的实时系统(如订单处理)。

2025-01-16 16:17:48 1104

原创 币安面经(1)

高并发、数据量大一般我们认为,单表行数超过 500 万行或者单表容量超过 2GB之后,才需要考虑做分库分表了,小于这个数据量,遇到性能问题先建议大家通过其他优化来解决。横向拆分(水平拆分)和纵向拆分(垂直拆分)。假如我们有一张表,如果把这张表中某一条记录的多个字段,拆分到多张表中,这种就是纵向拆分。那如果把一张表中的不同的记录分别放到不同的表中,这种就是横向拆分。分表算法全局ID分库分表框架是应文件系统所需而出的一种的变型树。一棵的和m阶的的差异在于:1) 有n棵子树的节点中含有n个关键字(即每个关键字对应

2025-01-16 12:17:37 1919

原创 快速排序经典写法

需要小小记忆一下,老是忘记,所以记录一下。第一次接触快速排序是王道的数据结构书上看的,觉得他们的写法挺简洁的。

2025-01-11 23:33:37 218

原创 LeetCode hot100-100

这题要领悟这个思想,所以起始是从1到n-1找的。因为有n个数,不重复的数就是1到n-1,重复了一个数之后才有的n个数。后面代码中的各种等号,right=mid,这跟传统二分还是不太一样,就是要理解上面的解法才知道为什么这样写。

2025-01-11 22:01:56 360

原创 LeetCode hot100-99

最后一步reverse是因为。第一步找的就是后面比前面大的数。所以找到i的位置后,i后面的位置的数都是前面比后面大,所以reverse一下的数才会更小。这题的做法,背一下吧。

2025-01-11 21:29:46 237

原创 LeetCode hot100-98

双指针,分别指向左侧的0和右侧的2.遍历,调整位置。

2025-01-11 20:17:14 136

原创 LeetCode hot100-97

排序,取n/2位置的元素。

2025-01-11 19:39:22 129

原创 LeetCode hot100-96

因为异或运算的特性,将所有数字异或处理之后得到的就是那个只出现过一次的数字。对于这道题,可使用异或运算 ⊕。异或运算有以下三个性质。这题的解答挺有意思的。

2025-01-11 19:19:07 352

原创 LeetCode hot100-95

若当前字符不相等,则dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1,分别对应替换、删除、插入操作。dp[i][j]表示将word1的前i个字符转换为word2的前j个字符所需的最小操作数。当i = 0时,将空字符串转换为word2的前j个字符,需要j次插入操作。当j = 0时,将word1的前i个字符转换为空字符串,需要i次删除操作。若当前字符相等,则dp[i][j] = dp[i-1][j-1]。

2025-01-10 00:53:52 270

原创 LeetCode hot100-94

经典问题,全文背诵即可。

2025-01-06 23:33:07 155

原创 LeetCode hot100-93

子串的结束位置j是i和len算出来的。如果子串长度大于 2(j - i > 1),还需要判断 dp[i+1][j-1] 是否为 true。内部子串 s[i+1…j-1] 也是回文:dp[i+1][j-1] = true。如果子串长度为 2(j - i == 1),只需判断 s[i] == s[j]。dp[i][j] = false 表示子串 s[i…dp[i][j] = true 表示子串 s[i…如果子串长度为 1(j - i == 0),它本身是回文。两端字符相等:s[i] == s[j]

2024-12-22 19:34:16 405

原创 LeetCode hot100-92

dp[i][j] 表示从左上角出发到 (i,j) 位置的最小路径和。显然,dp[0][0]=grid[0][0]。当 i>0 且 j>0 时,dp[i][j]=min(dp[i−1][j],dp[i][j−1])+grid[i][j]。当 i>0 且 j=0 时,dp[i][0]=dp[i−1][0]+grid[i][0]。当 i=0 且 j>0 时,dp[0][j]=dp[0][j−1]+grid[0][j]。最后得到 dp[m−1][n−1] 的值即为从网格左上角到网格右下角的最小路径和。

2024-12-20 18:10:02 449

原创 LeetCode hot100-91

构建一个二维数组 dp,其中 dp[i][j] 表示从起点到位置 (i, j) 的路径总数。第一行和第一列的路径数都为 1(机器人只能一直向右或向下)。起点 dp[0][0] = 1,因为机器人只能从起点开始。返回 dp[m-1][n-1],即右下角位置的路径数。

2024-12-20 17:24:27 343

原创 LeetCode hot100-90

动态规划的分析看着太复杂了,这题最经典的应该是用栈来做吧。感觉这题就是个模版,需要背一下那种。如果栈不为空,计算当前有效括号的长度(当前索引 - 栈顶索引),并更新最大长度。-1 是一个“哨兵”值,用来帮助计算从字符串开始位置的有效括号长度。如果栈为空,说明当前括号无法匹配,将当前索引入栈,作为新的“起点”。通过索引,我们可以计算出当前有效括号的长度。如果当前字符是 ‘(’,将其索引入栈。栈中的元素表示未匹配的括号的索引。

2024-12-20 16:33:56 312

原创 LeetCode hot100-89

对每个数 num,从后往前更新 dp 数组:如果 dp[j - num] 为 true,则 dp[j] 也可以为 true,表示可以选择该 num 来组成和为 j 的子集。如果 S 是偶数,目标是找到一个子集,使得其和为 S / 2。也就是说,问题转化为 判断是否存在一个子集,其和为 S / 2。如果 S 是奇数,显然无法将数组分割成两个和相等的子集,因为两个相等的子集的和必然是偶数。假设数组 nums 的总和为 S。初始化 dp[0] = true,表示和为 0 的子集是存在的(即空子集)。

2024-12-19 21:02:56 297

原创 LeetCode hot100-88

如果遇到负数,max_so_far 会和 min_so_far 交换,因为负数与最小值相乘可能变成最大值,min_so_far 会乘以负数变得更加负。如果遇到正数,max_so_far 会乘以该数来增大乘积,min_so_far 会乘以该数来减少乘积。如果遇到零,乘积会变成零,此时我们需要重置 max_so_far 和 min_so_far。min_so_far:当前遍历到的位置的最小乘积(因为负数乘以负数可能变成正数)。max_so_far:当前遍历到的位置的最大乘积。

2024-12-19 20:09:03 324

原创 LeetCode hot100-87

dp[i]为下标为i的元素作为子串的最后一个元素。

2024-12-19 19:11:43 360

原创 LeetCode hot100-86

我觉得这题比较难的思考的点是不知道字符串怎么和dp方程联系起来,就是用了boolean来找每一位的状态。定义 dp[i] 为 s[0:i] 是否可以由字典中的单词组成。即,dp[i] 表示从字符串的起始位置到第 i 个字符的子字符串是否可以拆分成字典中的单词。如果 dp[j] 是 true 且 s[j:i] 是字典中的一个单词,那么 dp[i] 就是 true。最终的答案是 dp[s.length()],如果它是 true,说明字符串 s 可以被拆分,否则不能。其中 j 是从 0 到 i 的所有位置。

2024-12-18 20:57:44 342

原创 LeetCode hot100-85

这题不用Integer.MAX_VALUE我看了下给的第二个案例就溢出了,coins =[2],amount =3。这题没有用Integer.MAX_VALUE,用了amount+1来表示一个不可达的数,因为凑硬币就算是凑一块一块的也最多只需要amount个,amount+1就可以用来表示凑不出来的情况。也可以不用Integer.MAX_VALUE,用一个Integer.MAX_VALUE/2,测试案例正常情况下是到不了这么大的,我试了下能过。

2024-12-18 20:28:12 499

原创 LeetCode hot100-84

dp[i] = min(dp[i], dp[i - j^2] + 1),其中 j 是从 1 到 sqrt(i) 的整数,j^2 是完全平方数。这里的意义是,如果你从 i - j^2 得到一个解,那么 i 就可以通过加上一个平方数 j^2 来得到。+1 表示使用了一个平方数。定义 dp[i] 为构成整数 i 的完全平方数的最少数量。dp[0] = 0,因为 0 需要 0 个完全平方数。dp[n] 即为所求的最小数量。

2024-12-18 19:14:16 282

原创 LeetCode hot100-83

偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。两种解法也可以同时掌握,特别是第二种,实现状态转移方程的时候还是得思考一下为什么要这样写。不偷窃第 k 间房屋,偷窃总金额为前 k−1 间房屋的最高总金额。只有两间房屋,选择其中金额较高的房屋进行偷窃。

2024-12-17 20:19:09 230

原创 LeetCode hot100-82

其他元素等于上一行中相邻两个元素之和,即第 i 行的第 j 个元素为:triangle[i-1][j-1] + triangle[i-1][j]。从第三行开始,每一行的第一个和最后一个元素都是 1。就看出这个规则就能开始写代码了。第二行是 [1, 1]。

2024-12-17 19:51:48 323

原创 LeetCode hot100-81

对于每个阶梯 i,你可以从第 i-1 阶跳 1 阶,或者从第 i-2 阶跳 2 阶。因此,dp[i] = dp[i-1] + dp[i-2]。这意味着到达第 i 阶的总方法数等于到达第 i-1 阶的方法数和到达第 i-2 阶的方法数之和。官方解法里对前面三层的算法里我感觉不太好懂,在评论区找了个好懂的解法。设 dp[i] 表示爬到第 i 阶楼梯的方法总数。

2024-12-17 19:24:26 323

原创 LeetCode hot100-80

最开始第一个字母就是a,至少要找到a的最终位置才能划分第一个区间。还好最后一个a后没有出现过b,c了。第二个区间就从d开始,找到最后一个d的过程中囊括了e,f。且最后一个d后还出现过e,那么d到最后一个d就不足以划分区间,还得把出现的e,f全划分进去。当划过第一个d时end更新为最后一个d。当划过第一个e时end已更新为最后一个e。划分结果为 “ababcbaca”、“defegde”、“hijhklij”

2024-12-17 01:05:04 287

原创 LeetCode hot100-79

如果 i == end,表示我们已经到达了当前跳跃范围的边界,也就是说,我们跳跃到这个位置时,已经不能再继续前进,而是需要再进行一次跳跃。例如,假设我们处在索引 2,nums[2] = 3,那么我们可以跳到索引 2 + 3 = 5,也就是我们最远能跳到的位置是 5。通过维护 end 来表示当前跳跃的最远位置,并通过 farthest 来表示我们能到达的最远位置。每当 end 到达当前跳跃范围的最远位置时,我们增加跳跃次数,并更新跳跃范围的最远位置。从当前位置开始,选择下一个跳跃的目标是能跳到的最远位置。

2024-12-17 00:31:23 371

原创 LeetCode hot100-78

贪心算法,第一次做做不出来我原谅自己。看着代码多么简洁啊。官方分析也写得挺好的。注意下为什么要写if(i<=rightmost)因为比如这个例子nums =[3,2,1,0,4]。到数字0那里不应该往后走了的,因为前面的那几个数字最多只走到0那里,如果不加限制条件就会直接往后循环,肯定能走到最后啊。

2024-12-16 23:50:39 228

原创 LeetCode hot100-77

优化在哪里呢,就只需要一次遍历就行。求到从前往后的最低点了,到当前位置只需要找,当前位置减最低点的利润是不是大于维护的最大利润就行。因为最低点是从前往后实时维护的,所以它总是当前位置之前的一段中的最低点。暴力解法,超时,意料之中。

2024-12-15 22:14:47 280

原创 LeetCode hot100-76

小顶堆保存最大的一半数字。大顶堆保存最小的一半数字。然后求中位数就只需要关注 两个堆顶就行。如何做到,看代码吧。主要就是顺序地一个堆进一个数字,就保证了两个堆一人一半数字。小顶堆为最大的一半就是将数字从大顶堆过一遍再把堆顶给小顶堆就可以做到了。这道题用List直接算中位数会超时。

2024-12-15 21:44:30 333

原创 LeetCode hot100-75

这题有进阶要求的时间复杂度,看了下进阶的有点复杂。不过我写的用map也能过,先低要求自己,过了就行。

2024-12-15 20:00:12 329

原创 LeetCode hot100-74

这个快排写得比较简洁。就找前面的第k-1个位置就行。用rand作为枢纽也可以加速。这题的解法在leetcode评论区里找的。

2024-12-15 00:07:03 368

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除