leecodecode【面试150】【2026.7.2打卡-java版本】
被围绕的区域要点bfsclass Solution { public void solve(char[][] board) { //bfs int m board.length; int n board[0].length; for(int j 0; j n; j){ if(board[0][j] O){ bfs(0, j, board); } if(board[m-1][j] O){ bfs(m-1, j, board); } } for(int i 0; i m; i){ if(board[i][0] O){ bfs(i,0,board); } if(board[i][n-1] O){ bfs(i, n-1, board); } } for(int i 0; i m; i){ for(int j 0; j n; j){ //注意顺序 if(board[i][j] O){ board[i][j] X; } if(board[i][j] #){ board[i][j] O; } } } } public void bfs(int i, int j, char[][] board){ //退出的条件 if(i 0 || i board.length || j 0 || j board[0].length || board[i][j] X || board[i][j] #){ return; } board[i][j] #; bfs(i1, j, board); bfs(i-1, j, board); bfs(i,j1,board); bfs(i, j-1,board); } }课程表要点建图入度bfsclass Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { //建图计算入度然后找入度为0 的bfs计算课程 //第一步建图 ListInteger[] graph new ArrayList[numCourses]; for(int i 0; i numCourses; i){ graph[i] new ArrayList(); } //第二步统计入度 完善图的关系 int[] inDegree new int[numCourses]; for(int[] p : prerequisites){ //这个要修改 int pre p[1]; int next p[0]; graph[pre].add(next); inDegree[next]; } //第三步找出入读为0的课程 DequeInteger queue new ArrayDeque(); for(int i 0; i numCourses; i){ if(inDegree[i] 0){ queue.offer(i); } } //第四步 开启上课 bfs int count 0; while(!queue.isEmpty()){ int current queue.poll(); count; for(int nextcourse : graph[current]){ inDegree[nextcourse]--; if(inDegree[nextcourse] 0){ queue.offer(nextcourse); } } } return count numCourses; } }课程表 II要点同上价格返回的数组class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { // 1. 建图邻接表 ListInteger[] graph new ArrayList[numCourses]; for (int i 0; i numCourses; i) { graph[i] new ArrayList(); } // 2. 统计入度 填充图 int[] inDegree new int[numCourses]; for (int[] p : prerequisites) { int pre p[1]; // 先修课 int next p[0]; // 后修课 graph[pre].add(next); inDegree[next]; // 后修课的入度 1 } // 3. 将所有入度为 0 的课程入队可以直接学 DequeInteger queue new ArrayDeque(); for (int i 0; i numCourses; i) { if (inDegree[i] 0) { queue.offer(i); } } // 4. BFS 拓扑排序同时记录学习顺序 int[] result new int[numCourses]; // 存储最终顺序 int index 0; // 当前填到 result 的第几个位置 while (!queue.isEmpty()) { int current queue.poll(); result[index] current; // 学完这门课记录顺序 for (int nextCourse : graph[current]) { inDegree[nextCourse]--; // 依赖当前课的课程前置需求减1 if (inDegree[nextCourse] 0) { queue.offer(nextCourse); } } } // 5. 如果所有课程都能被安排返回顺序否则返回空数组 if (index numCourses) { return result; } else { return new int[0]; // 有环无法完成 } } }随机知识HashMap JDK1.7 头插法 vs JDK1.8 尾插法完整解析一、先搞懂什么是头插、尾插HashMap 底层数组 链表当哈希冲突时新元素挂载到链表上JDK1.7 头插法新节点直接放在链表头部原来的链表整体挂在新节点后面。 插入顺序A→B→C链表存储顺序C→B→A逆序JDK1.8 尾插法遍历到链表尾部把新节点接在最后。 插入顺序A→B→C链表存储顺序A→B→C原顺序保留二、JDK1.7 为什么设计头插初衷设计者理论假设刚插入的元素后续被查询的概率更高。 头插后新元素在链表头部查询时不用遍历整条链表能更快命中提升查询效率。 单线程环境下这个逻辑没问题但完全没考虑多线程并发扩容场景。三、头插法致命缺陷并发扩容死循环CPU100%1. 扩容核心逻辑HashMap 容量满了会触发扩容新建 2 倍长度数组把旧数组所有链表节点重新哈希迁移到新数组。 头插迁移规则每条链表节点从头取出依次插到新链表头部迁移后链表反转。2. 并发下环形链表产生过程两个线程同时扩容假设原链表A → B两线程 T1、T2 同时执行resize()扩容T1 先执行到迁移节点A刚取出 A时间片被剥夺暂停T2 完整完成扩容取出 A 头插 → 新链表 [A]取出 B 头插 → 新链表 [B→A] 此时内存中B.next AA.next nullT1 恢复继续执行持有旧节点 AT1 把 A 头插到新数组A.next null再取旧链表下一个节点 B把 B 头插B.next A循环读取 B 的下一个节点 A再次头插A.next B最终形成环A ↔ B环形链表。3. 死循环现象后续任何操作get/put遍历这条链表时永远在 A、B 之间无限循环线程卡死CPU 占用直接拉满 100%。 除此之外并发头插还会出现数据丢失、数据重复问题。四、JDK1.8 尾插法如何彻底规避环形链表1. 迁移规则改变保留原有链表顺序扩容迁移时整条链表按原顺序复制节点相对顺序不变不会反转链表。 原链表A→B迁移后依然A→B。2. 为什么不会出现环尾插是顺序遍历追加不会颠倒节点指向迁移时先完整记录当前链表头、尾节点依次把节点接到新链表尾部节点的 next 指针只单向向后不存在 “后插入节点指向前面节点” 的反向指针永远不可能形成闭环。多线程同时扩容时最多出现数据覆盖、丢失HashMap 本身线程不安全这点没变不会生成环形链表彻底杜绝死循环 CPU 打满问题。五、补充两个关键细节HashMap 本身自始至终都不是线程安全尾插只是修复了并发扩容死循环 bug多线程场景依然会丢数据、覆盖数据并发环境必须用ConcurrentHashMap。JDK1.8 不止改了插入方式 冲突链表长度超过 8 会转为红黑树进一步降低长链表遍历开销弥补了尾插 “新元素在尾部查询略慢” 的微小缺陷。六、一句话总结JDK1.7 头插设计初衷是热点数据快速查询但并发扩容链表反转极易形成环形链表死循环 CPU100%JDK1.8 尾插扩容迁移保留链表原有顺序节点指针单向无反向闭环彻底解决并发扩容死循环漏洞。碎碎念后续会更新每天学习的八股和算法 题开始准备秋招的第53天。努力连续更新100天以后每天就按秋招项目【java agent】科研必做项目算法八股锻炼身体来总结。总结慢慢恢复状态吧1.算法面试150 100/150 2h2.秋招项目【java 项目】【agent 项目 】3.科研要跑一下4.实习6h6.背八股1h7.锻炼身体明天试试番茄钟学习法吧

相关新闻

锐捷ACL单向TCP互通组网-使用TCP三次握手SYN包置位为1实现

锐捷ACL单向TCP互通组网-使用TCP三次握手SYN包置位为1实现

一 组网说明用户需求:客户网络建设初期规划比较乱,并且经过多位运维工程师,不同区域之间服务器又没有防火墙,如果不同区域服务器之间互相通信会存在数据丢失的风险,所以需要不同区域服务器之间经过交换机的时候只能实现…

2026/7/5 13:57:31阅读更多 →
Python sort函数参数藏大招!用错它,你的代码直接废了

Python sort函数参数藏大招!用错它,你的代码直接废了

排序这个操作作为其中的一个基本操作, 该语言给出了两种主要的数据排序办法: sort()以及(), 虽说两者都是用以按特定顺序去排列数据, 然而它们展开工作的方式存在稍许不同, 且应用于不一样的场景, 弄明白sort(&#xf…

2026/7/5 13:57:31阅读更多 →
操作系统线程管理深度精讲,进程线程本质区别、线程TCB、共享私有资源、线程生命周期、多线程优缺点与线程安全底层原理

操作系统线程管理深度精讲,进程线程本质区别、线程TCB、共享私有资源、线程生命周期、多线程优缺点与线程安全底层原理

0. 前言:从进程重型并发到线程轻量并发我们彻底吃透了操作系统进程管理全套体系,掌握了PCB内核结构、进程五态流转、fork写时复制、孤儿与僵尸进程根治方案,清晰认识到:进程是资源分配的最小单位,但是进程太重、切换开…

2026/7/5 13:52:31阅读更多 →
PyTorch 2.0+ 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧

PyTorch 2.0+ 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧

PyTorch 2.0 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧当你在Fashion MNIST数据集上训练一个基础CNN模型时,91%的准确率可能看起来已经不错了。但对于追求极致性能的开发者来说,这仅仅是起点。本文将分享三个经过实战验证的…

2026/7/5 14:52:35阅读更多 →
groupby + agg:数据分析 80% 的活就这两招

groupby + agg:数据分析 80% 的活就这两招

groupby agg:数据分析 80% 的活就这两招 “各品类销售额多少?” “每个月的 GMV 趋势?” “各部门绩效排名?” 这些问题的答案,都是 groupby 聚合。 Excel 里你要拉透视表、写 SUMIF,Pandas 里就两行。 g…

2026/7/5 14:52:35阅读更多 →
羞羞答答地搞了个数学宝典

羞羞答答地搞了个数学宝典

从申请软著到断断续续开发,搞了一年,总算上架了。 小米市场上架最快,当天提交,当天上架。 App Store审核时间长达8天,但一次性通过。最难的华为市场,因为重名,还得重新备案,导致现在…

2026/7/5 14:52:35阅读更多 →
ViT (Vision Transformer) 图像分类实战:ImageNet-1K 上 85.2% Top-1 精度复现指南

ViT (Vision Transformer) 图像分类实战:ImageNet-1K 上 85.2% Top-1 精度复现指南

ViT (Vision Transformer) 图像分类实战:从零实现ImageNet-1K 85.2% Top-1精度当卷积神经网络(CNN)长期统治计算机视觉领域时,2020年一篇名为《An Image is Worth 16x16 Words》的论文彻底改变了游戏规则。Vision Transformer&…

2026/7/5 14:52:35阅读更多 →
数据在内存中的存储:从整数到浮点数的底层原理

数据在内存中的存储:从整数到浮点数的底层原理

📑 本文目录 📖 1. 整数在内存中的存储 🧩 原码、反码、补码的定义🤔 为什么计算机要使用补码? 📖 2. 大小端字节序和字节序判断 🧩 2.1 什么是大小端?🤔 2.2 为什么会有…

2026/7/5 14:52:35阅读更多 →
[操作系统]操作系统核心笔记(面试)

[操作系统]操作系统核心笔记(面试)

一、OS核心框架模块[0x0001][0x0001]核心考查形式进程管理[0x0001][0x0001]计算题(调度、死锁)、综合题内存管理[0x0001][0x0001]计算题(地址变换、缺页)、概念题文件管理[0x0001][0x0001]选择题、基础应用题设备管理[0x0001][0x0…

2026/7/5 14:47:34阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →