之前25年初第一次刷完了算法题,后面从四月份开始搞论文,就没有再摸过,记录一下吧
2025.11.18 -- 6题
704. 二分查找 - 力扣(LeetCode) 大一时候的噩梦,考虑好边界条件就没事
35. 搜索插入位置 - 力扣(LeetCode) 二分变体,用时 07:00
晚上去吃涮羊肉喝了一点,晕晕的,21:21继续写
69. x 的平方根 - 力扣(LeetCode) 二分变体,用时 27:39,涉及int和long的区别
Java中:最小值是 -2,147,483,648(-2^31),最大值是 2,147,483,647(2^31 - 1);
我的错误代码:当x=2147395599时,num*num大于int上限,溢出后变成了一个负数,负数永远小于x,所以l一直加,mid一直变大,num一直变大,num*num一直是负数,死循环,超时
// 错误代码:
class Solution {
public int mySqrt(int x) {
int l = 0;
int r = x;
while (l <= r) {
int mid = (l + r) / 2;
int num = mid + 1;
if (num * num == x) {
return num;
} else if (num * num > x) {
r = mid - 1;
} else if (num * num < x) {
l = mid + 1;
}
}
return l;
}
}
正确的做法是用long类型承接num*num
class Solution {
public int mySqrt(int x) {
int l = 0;
int r = x;
while (l <= r) {
int mid = (l + r) / 2;
long num = mid + 1;
if (num * num == x) {
return (int) num;
} else if (num * num > x) {
r = mid - 1;
} else if (num * num < x) {
l = mid + 1;
}
}
return l;
}
}
367. 有效的完全平方数 - 力扣(LeetCode) 二分变体,用时 9:32,和上一题一样
27. 移除元素 - 力扣(LeetCode) 第一次做的时候新创了一个ArrayList用于存放nums中非val的值,最后再放回。实际这个题是想让人用双指针,用时3:49。一个记录左边更新位置,一个记录右边遍历位置。
26. 删除有序数组中的重复项 - 力扣(LeetCode) 双指针变体,用时5:04
283. 移动零 - 力扣(LeetCode) 双指针变体,用时5:08
之前25年初第一次刷完了算法题,后面从四月份开始搞论文,就没有再摸过,记录一下吧
2025.11.19 -- 3题
844. 比较含退格的字符串 - 力扣(LeetCode) 第一遍用ArrayList当栈做,双指针变体,但是感觉没必要折磨自己
977. 有序数组的平方 - 力扣(LeetCode) 温习一下Arrays.sort()和冒泡算法
209. 长度最小的子数组 - 力扣(LeetCode) 子数组用滑动窗口做,先定end再定start
2025.11.26 -- 4题
前些天在搞论文,今天继续,要准备面试,所以做些面经手撕题
🐱💻面经:一个上午速通华为三面,接下来泡池子 - 小红书 (后来发现这是博士面经 ... ... )
- 343. 整数拆分 - 力扣(LeetCode) dp,不温习写不出来😥
- 98. 可达路径 dfs,邻接表√,数组矩阵√
- 797. 所有可能的路径 - 力扣(LeetCode) 同上
- 99. 计数孤岛 dfs√,bfs√
- RAG的内容如何存储?
- 将原始文本拆分为更小的语义片段(块),然后使用嵌入模型将这些文本块转换为高维向量(即向量化),最后将这些向量及其对应的原始文本(作为元数据)一并存入专门的向量数据库中。
2025.11.27 -- 6题
🐱💻面经 - 小红书
64. 最小路径和 - 力扣(LeetCode) dp,好写
20. 有效的括号 - 力扣(LeetCode) Stack<Character> st = new Stack<Character>();
59. 螺旋矩阵 II - 力扣(LeetCode) 这个简单,用时20分钟
54. 螺旋矩阵 - 力扣(LeetCode) 这个令人不适,因为不是正方形矩阵。m和n不相等的情况需要单独拿出来,最后把中间那一行或一列再加入到result数组中(代码随想录上数组6临接矩阵这里不用做了)
443. 压缩字符串 - 力扣(LeetCode) 双指针,其中read指针每轮会后移多次,所以建议用while
1456. 定长子串中元音的最大数目 - 力扣(LeetCode) 滑动窗口
2025.11.28 -- 2题
451. 根据字符出现频率排序 - 力扣(LeetCode) 学习一下内置函数用法
1985. 找出数组中的第 K 大整数 - 力扣(LeetCode) 用BigInteger转字符串大数字,记得import java.math.*,这个题
2025.12.5 -- 7题
58. 区间和(第九期模拟笔试) 前缀和
44. 开发商购买土地(第五期模拟笔试) 二维前缀和
77. 组合 - 力扣(LeetCode) 回溯,假如path是LinkedList或ArrayList,在List<List<Integer>>的result中加入path:result.add(new ArrayList<>(path)); 一定要new ArrayList<>()
216. 组合总和 III - 力扣(LeetCode) 在回溯函数的return中加上一个和的判断即可
17. 电话号码的字母组合 - 力扣(LeetCode) StringBuffer append deleteCharAt
39. 组合总和 - 力扣(LeetCode) 做出来有一点运气成分,本题关键在startIndex的设置上
40. 组合总和 II - 力扣(LeetCode) 去重这里的逻辑没有想通,实际就是排序后当前元素如果和上一个值相同,且上一个元素没有被使用,则说明当前元素开始走上一个元素的老路了
2025.12.6 -- 29题
131. 分割回文串 - 力扣(LeetCode) 截取startIndex到i之间这段区间
93. 复原 IP 地址 - 力扣(LeetCode) 一个道理,不难 【回溯做了前十个】
144. 二叉树的前序遍历 - 力扣(LeetCode) 数组转字符串就用Arrays.toString(arr)
102. 二叉树的层序遍历 - 力扣(LeetCode) 我就用递归了先
107. 二叉树的层序遍历 II - 力扣(LeetCode) 对上一题的结果Collections.reverse(result)
199. 二叉树的右视图 - 力扣(LeetCode) 层序遍历变体
637. 二叉树的层平均值 - 力扣(LeetCode) Double tempSum = 0.0
429. N 叉树的层序遍历 - 力扣(LeetCode) 现在不仅只有left right了,所以递归函数中要用for遍历每个孩
515. 在每个树行中找最大值 - 力扣(LeetCode) Collections.max()
116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) 这次grid中存的是node
117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) 和上一个题做法一模一样,层序遍历管你是什么二叉树
104. 二叉树的最大深度 - 力扣(LeetCode) grid的大小
111. 二叉树的最小深度 - 力扣(LeetCode) 递归终止条件中加入对当前节点是叶的判断,随后比较深度
226. 翻转二叉树 - 力扣(LeetCode) 创建临时节点,交换left right
101. 对称二叉树 - 力扣(LeetCode) 递归,left.left right.right
222. 完全二叉树的节点个数 - 力扣(LeetCode) 还是层级好用
110. 平衡二叉树 - 力扣(LeetCode) 嗯嗯竟然做出来了
257. 二叉树的所有路径 - 力扣(LeetCode) 感觉做递归还是稍微稀里糊涂
203. 移除链表元素 - 力扣(LeetCode) 你是要跳过当前这个还是直接到下一个
206. 反转链表 - 力扣(LeetCode) fakeNode
24. 两两交换链表中的节点 - 力扣(LeetCode) 最关键的是那个切换next的逻辑顺序
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 就是先获取整个链表长度
面试题 02.07. 链表相交 - 力扣(LeetCode) 链表迭代可以直接判断ptr和null是否相等,不是非要ptr.next
142. 环形链表 II - 力扣(LeetCode) 哈希表很简单。我一直记着这个题的快慢指针做法,是因为最开始用TS写这个题
242. 有效的字母异位词 - 力扣(LeetCode) Java哈希表有一个陷阱,当当前键对应的值太大,超过 -128~127 缓存范围,如:Integer a = 200;HashMap返回的是 Integer对象,使用 !=比较的是对象引用,而不是数值。所以应该用equals。实际上这个题最好用把字符串拆成字符数组,然后排序,比较字符数组是否相等。s.toCharArray() Arrays.sort() Arrays.equals(str1, str2)
349. 两个数组的交集 - 力扣(LeetCode) <>中类型应该为泛型,Boolean
1. 两数之和 - 力扣(LeetCode) 不能重复用一个数就判断一下index是否相等
2025.12.7 -- 15题
454. 四数相加 II - 力扣(LeetCode) 两两分组,第一组加入和,第二组找和的相反数
383. 赎金信 - 力扣(LeetCode) 两个哈希表比较每一项的大小
15. 三数之和 - 力扣(LeetCode) 双指针成名之战,定开后,l和r往中间靠拢,注意需要用while跳过之前相同的元素。这个就别拿哈希表了,折磨自己
18. 四数之和 - 力扣(LeetCode)注意ij的重复判断,同时sum的类型用long
long tempSum = (long)nums[i] + nums[j] + nums[left] + nums[right]; 这样正确
long tempSum = nums[i] + nums[j] + nums[left] + nums[right]; 这样错误,先四个int计算,已经溢出,是把溢出的结果给了tempSum
541. 反转字符串 II - 力扣(LeetCode) char[] c 转String:new String(c)
54. 替换数字(第八期模拟笔试) StringBuffer sb = new StringBuffer(); sb.toString(); sb.append();
151. 反转字符串中的单词 - 力扣(LeetCode) 内置函数题,
String s = " hello ";
String s = s.trim();
// 按照空格分隔,包括多个连续空格
String[] wordList = s.trim().split("\\s+");
// 把String[]转为List,随后倒叙
List<String> ans = new ArrayList<>(wordList);
// 用Collections.reverse()倒序
Collections.reverse(ans);
// 把List<String>中每一项连接起来
String.join(" ", wordList)
55. 右旋字符串(第八期模拟笔试) java字符串截取:s.substring
如果输入张这样,则下面的2后的换行符需要消耗
2
abcdefg
abcdefgbb
// 读取第一行:数字
int n = scanner.nextInt();
scanner.nextLine(); // 读取数字后的换行符
// 读取接下来的字符串
String[] strings = new String[n];
for (int i = 0; i < n; i++) {
strings[i] = scanner.nextLine();
}
28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode) ez
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode) List<Character>中每一个字符连接成字符串就用for吧
150. 逆波兰表达式求值 - 力扣(LeetCode) java字符串比较不能用==,要用equals。Stack就peek pop push
239. 滑动窗口最大值 - 力扣(LeetCode) 双端队列,Deque<Integer> q = new LinkedList<>(); 自定义一个队列,队列头最大,降序排列
2025.12.8 -- 题
455. 分发饼干 - 力扣(LeetCode) 小孩吃小的,大孩儿吃大的
2410. 运动员和训练师的最大匹配数 - 力扣(LeetCode) 和上题一样
376. 摆动序列 - 力扣(LeetCode) 这个题就贼离谱,边界条件不好处理,是因为一直在想前面的差和后面的差,实际就想现在是该上升还是该下降就好了,还很简单,很好理解
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length == 1) {
return 1;
}
boolean up = true;
boolean down = true;
int result = 1;
for (int i = 1; i < nums.length; i ++) {
if (up && nums[i - 1] < nums[i]) {
up = false;
down = true;
result ++;
} else if (down && nums[i - 1] > nums[i]) {
up = true;
down = false;
result ++;
}
}
return result;
}
}
53. 最大子数组和 - 力扣(LeetCode) 用dp做的,dp[i]为以nums[i]为结尾的子数组的最大和,从dp[i-1]+nums[i]和num[i]中选择更大的。贪心的思想是反正我都是负的了,就不能把负数再传递下去,当然我已经记录了之前达到的最大值
122. 买卖股票的最佳时机 II - 力扣(LeetCode) 因为可以同一天多次卖卖该股票,所以就是累加正的差
55. 跳跃游戏 - 力扣(LeetCode) 之前做不对是因为没办法正确描述代码逻辑,思路对的,就是没想到能让cover动态变大
45. 跳跃游戏 II - 力扣(LeetCode) 这两个条约游戏都很狡猾,遍历上限都是要及时调整的
1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 情况考虑完善
134. 加油站 - 力扣(LeetCode)不要被这个循环迷惑。怪题,如果tempSum < 0,清空tempSum,然后start = i + 1,不要被这个循环迷惑
😅135. 分发糖果 - 力扣(LeetCode) 没营养的困难,哪有什么思路,随看随记吧
860. 柠檬水找零 - 力扣(LeetCode) 模拟题,列出所有情况
2025.12.9 -- 题
😅 406. 根据身高重建队列 - 力扣(LeetCode) 先确定身高,随后按照第二项在对应的索引插入。
List<int[]> res = new ArrayList<>(); res.toArray(int[res.length][2]); int[res.length][2] 是给数组定型
452. 用最少数量的箭引爆气球 - 力扣(LeetCode) 我一直在想怎么解决a和b重叠,b和c重叠,但是a和c不重叠的情况,实际可以让b的end和a一样,这样就不用考虑b和c重叠。这个题就是找有多少个重叠
错误:
// -2147483646 - 2147483646 会溢出
Arrays.sort(points, (a, b) -> (a[0] - b[0]));
正确:Integer.compare(a, b)
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
435. 无重叠区间 - 力扣(LeetCode) 和上一道差不多,减去重叠数剩下就是不重叠
763. 划分字母区间 - 力扣(LeetCode) 记录当前最大范围值,判断是否和i相等,相等则截取这段

56. 合并区间 - 力扣(LeetCode) 如果当前结果中最后一个区间的1大于当前遍历到的区间的0,则合并,设置1为更大的1。否则,就把当前区间加入进去
738. 单调递增的数字 - 力扣(LeetCode) 首先判断原本是否就符合,如果不符合,就倒序遍历,记住需要从该索引向后全置9的索引,同时高一位-1
968. 监控二叉树 - 力扣(LeetCode) 四种情况,递归
2025.12.10 -- 题

Comments NOTHING