【Java实习面试算法冲刺】哈希!
第1类题型哈希表为什么哈希表题看起来简单你却最容易写错很多同学第一次刷哈希表题时会觉得这类题不难因为经典题像两数之和、存在重复元素看上去都不复杂。但真到了面试现场哈希表反而是最容易暴露基本功的一类题原因通常有这几种你知道这题和“查找”有关但第一反应还是双重循环。你隐约觉得要用哈希结构却分不清该用Map还是Set。你会写HashMap但“先查再放”还是“先放再查”总是容易写反。你能把代码写出来却说不清为什么它能把复杂度从O(n^2)压到O(n)。如果你现在正处在“会做部分 Easy但题面一变就没把握面试一追问就容易乱”的阶段这一类题最值得先练。读完这篇你至少要把 3 件事练熟看到题先想到哈希、能把模板写稳、能在面试里把思路讲清楚。文章目录第1类题型哈希表为什么哈希表题看起来简单你却最容易写错1. 核心知识点动画辅助理解先查 complement再写入 map2. 这类题在面试里考什么3. 高频题清单4. 这类题最容易犯的 3 个错误5. 代表题精讲 1题目思路Java 代码复杂度如果这是面试现场你可以这样说手推一遍最容易记住的状态变化6. 代表题精讲 2题目思路Java 代码复杂度如果这是面试现场你可以这样说为什么这里用 Set 就够了7. 其余题模板与关键片段[217. 存在重复元素](https://leetcode.cn/problems/contains-duplicate/)[242. 有效的字母异位词](https://leetcode.cn/problems/valid-anagram/)8. 边界、易混点与替代方案Map 和 Set 怎么选哈希和排序怎么选哈希和计数数组怎么选哪些情况要格外小心9. 你学完后怎么验证自己真的会了10. 错题本记录方式11. 适用范围与边界12. 面试前 3 分钟速记13. 结尾把“会做题”变成“会识别、会写、会讲”1. 核心知识点哈希表最适合解决这几类问题查某个值是否存在。统计某个元素出现次数。建立“值到位置”或“值到次数”的映射。去重。把原本需要两层循环的查找压成一层循环。实习面试里你可以先这样判断如果题目里出现“是否存在”“两数配对”“出现次数”“去重”“映射关系”优先想哈希表。Java 里最常用的是两个结构HashMapK, V需要存键值对时用。HashSetE只关心某个元素是否出现过时用。最常见的写法有这几类MapInteger,IntegermapnewHashMap();map.put(nums[i],i);map.get(target);map.getOrDefault(x,0);SetIntegersetnewHashSet();set.add(x);set.contains(x);边界上最容易错的是两件事先判断还是先插入。值重复时旧下标是否会被覆盖。动画辅助理解先查 complement再写入 map哈希表题最适合用1. 两数之和来建立第一印象。你可以先打开本地动画页哈希表两数之和分步动画这个动画只看一件事遍历到当前数时先计算它缺的另一个数也就是complement target - nums[i]再去map里查这个 complement 是否已经出现过。以nums [2, 7, 11, 15]、target 9为例当前值需要的 complement查询 map下一步27查不到7把2 - 0写入 map72查到2 - 0返回[0, 1]这一步能解释为什么代码必须“先查再放”。如果你先把当前的7放进 map再去查 complement就会混淆“之前出现过的数”和“当前正在处理的数”。在面试里哈希表题经常不是难在 API而是难在这个状态更新顺序。2. 这类题在面试里考什么哈希表题的面试考察很基础但非常能看出习惯是否成熟。你能不能把暴力查找压成线性时间。你是否熟悉 Java 的Map/Set写法。你能不能在一次遍历里同时维护状态和答案。你是否会处理重复值、缺失值、默认值这些细节。面试官想看到的不是你会背HashMap定义而是你能快速说出为什么不用双重循环。为什么这里用Map而不是Set。为什么这里应该先查再放或者先放再查。3. 高频题清单题目来源难度高频属性1. 两数之和LeetCode 热题 100Easy面试高频217. 存在重复元素面试经典 150Easy面试高频242. 有效的字母异位词面试经典 150Easy基础高频128. 最长连续序列LeetCode 热题 100Medium真实面经高频4. 这类题最容易犯的 3 个错误题目本质是查找和配对结果还在写双重循环。该用Set的地方用了Map把简单题写复杂。Map更新顺序写反导致同一个元素被重复使用或下标覆盖。5. 代表题精讲 1题目1. 两数之和思路暴力做法是双重循环枚举每一对数看它们的和是不是target复杂度是O(n^2)。更好的办法是边遍历边查找。假设当前数是nums[i]那我只需要看前面有没有一个数等于target - nums[i]。这个“前面有没有”非常适合用哈希表维护。因此做法是遍历数组。先查哈希表中是否存在target - nums[i]。如果存在直接返回答案。如果不存在把当前值和当前下标放进哈希表。这里“先查再放”非常关键因为题目不允许同一个元素使用两次。Java 代码importjava.util.HashMap;importjava.util.Map;classSolution{publicint[]twoSum(int[]nums,inttarget){MapInteger,IntegerindexMapnewHashMap();for(inti0;inums.length;i){intneedtarget-nums[i];if(indexMap.containsKey(need)){returnnewint[]{indexMap.get(need),i};}indexMap.put(nums[i],i);}returnnewint[0];}}复杂度时间复杂度O(n)空间复杂度O(n)如果这是面试现场你可以这样说这题我会先把它归类为哈希查找题。暴力做法是双重循环时间复杂度O(n^2)。更好的做法是一边遍历一边用HashMap记录已经出现过的数字及其下标。对于当前元素nums[i]只需要看target - nums[i]是否已经出现过。如果出现过就能直接得到答案这样整体时间复杂度降到O(n)。手推一遍最容易记住的状态变化以nums [2, 7, 11, 15]、target 9为例当前下标i当前值nums[i]需要找的值target - nums[i]哈希表查询前内容结果027{}找不到放入2 - 0172{20}找到返回0, 1这个过程最值得记住的不是答案本身而是顺序先查补数再放当前元素。只要你把顺序写反就有机会把同一个元素错误复用两次。6. 代表题精讲 2题目128. 最长连续序列思路这题最容易误入排序思路。排序后当然能做但时间复杂度是O(n log n)。题目真正想考的是你能不能用哈希表把它压到O(n)。关键观察是如果一个数x的前一个数x - 1不存在那么x就可能是一段连续序列的起点。只有在起点处才继续向后扩展统计长度。做法先把所有数放进HashSet。遍历每个数x。如果x - 1存在说明它不是起点跳过。如果x - 1不存在就从x开始不断检查x 1, x 2...。统计最长长度。这样每个数最多被作为扩展的一部分检查一次总体还是线性复杂度。Java 代码importjava.util.HashSet;importjava.util.Set;classSolution{publicintlongestConsecutive(int[]nums){SetIntegersetnewHashSet();for(intnum:nums){set.add(num);}intbest0;for(intnum:set){if(set.contains(num-1)){continue;}intcurrentnum;intlength1;while(set.contains(current1)){current;length;}bestMath.max(best,length);}returnbest;}}复杂度时间复杂度O(n)空间复杂度O(n)如果这是面试现场你可以这样说这题虽然也能排序做但排序会把复杂度带到O(n log n)。如果想做到线性时间关键是把所有元素放进HashSet然后只从“可能的起点”开始往后扩展。判断起点的方法是看num - 1是否不存在。这样可以避免重复扫描同一段连续区间。为什么这里用Set就够了这题不需要记录下标也不需要记录次数真正需要的是两件事某个数是否存在。某个数是不是一段连续区间的起点。这两件事都只和“存在性”有关所以HashSet已经足够。很多同学会下意识写成MapInteger, Integer但那只会让代码更重并没有提供额外价值。7. 其余题模板与关键片段217. 存在重复元素核心就是去重SetIntegerseennewHashSet();for(intnum:nums){if(!seen.add(num)){returntrue;}}returnfalse;242. 有效的字母异位词如果只包含小写字母直接用计数数组int[]countnewint[26];for(charc:s.toCharArray())count[c-a];for(charc:t.toCharArray())count[c-a]--;for(intx:count){if(x!0)returnfalse;}returntrue;这题的重点不是哈希一定比数组好而是你要知道在字符范围固定时数组比MapCharacter, Integer更直接。8. 边界、易混点与替代方案Map和Set怎么选只关心元素是否出现过优先Set还要记录下标、次数、映射关系优先Map如果你发现自己在代码里存了一个值却从头到尾没有用到这个值对应的附加信息通常就说明结构选重了。哈希和排序怎么选很多题都能“排序后再做”但排序会改变复杂度也可能打乱原始下标信息。像两数之和这类要保留下标的题哈希往往更直接像最长连续序列这种题排序可做但不是题目真正想考的最优思路。哈希和计数数组怎么选如果值域或字符集固定计数数组常常比哈希更轻比如有效的字母异位词。如果值域不固定、需要通用映射能力哈希就更稳。哪些情况要格外小心题目不允许同一个元素用两次时重点检查“先查后放”。题目有重复值时重点检查旧值被覆盖后是否影响答案。题目只问存在性时别把简单题写成维护复杂映射的大题。9. 你学完后怎么验证自己真的会了不要只看完文章就算结束。更有效的做法是用下面 3 组自测来判断你是否真的掌握10 分钟内独立写出两数之和并且不用回忆题解文字只靠“先查再放”的识别信号完成。看见最长连续序列时能主动说出为什么不是必须排序为什么只从起点开始扩展。看到存在重复元素、有效的字母异位词这类题时能快速判断该用Set、Map还是计数数组。如果你在自测时出现下面任意一种情况就说明还没有真正掌握能看懂代码但自己从空白开始写不出来。写得出来但说不清为什么复杂度是O(n)。知道要用哈希但结构一会儿用Map一会儿用Set没有判断标准。比较稳妥的过关标准是你能在 15 分钟内做出一道基础哈希题并且在 1 分钟内口述题型判断、核心思路和复杂度。10. 错题本记录方式哈希表题建议重点记录这几类卡点我到底为什么没想到用哈希而是写了暴力。我是否判断错了应该用Map还是Set。我是“先查后放”写错还是默认值更新写错。这题的识别信号是什么比如“配对”“频次”“去重”“是否存在”。11. 适用范围与边界本文默认你已经会 Java 数组遍历、条件判断和基础集合写法。本文重点服务于 Java 实习面试、LeetCode 高频 Easy / Medium 和常见笔试基础题。本文不覆盖哈希冲突底层实现、并发哈希容器或竞赛向复杂技巧。如果你当前连HashMap/HashSet的基本 API 都不熟建议先补 Java 集合基础再回来刷这类题效果会更好。12. 面试前 3 分钟速记看到“配对、是否存在、频次、去重”优先想哈希表。只关心是否出现过用HashSet。还要记下标或次数用HashMap。两数之和记住“先查再放”。最长连续序列记住“只从起点开始扩展”。Java 常用写法containsKey、getOrDefault、add返回值。13. 结尾把“会做题”变成“会识别、会写、会讲”哈希表之所以适合作为第一类题型不是因为它最简单而是因为它最适合帮你建立题型意识。你从这类题开始练最重要的收获不是记住某道题的答案而是养成几个稳定动作看到题先判断是不是“存在性、配对、频次、去重”问题。写代码时先想清楚Map和Set的职责区别。做完题后能用一句话解释为什么哈希把暴力查找压成了线性复杂度。如果这几个动作稳定下来后面的双指针、滑动窗口、图论和动态规划你都会更容易进入状态。感谢阅读记得点赞、关注、收藏欢迎各位评论区交流下一篇继续看第 2 类高频题型双指针。

相关新闻

【硬件笔记】DCDC电源设计—BUCK电路设计要点

【硬件笔记】DCDC电源设计—BUCK电路设计要点

目录 1.1 BUCK电路中,PCB 布局该注意哪些?1.1.0 BUCK 电路的结构框图1.1.1 功率回路:电感放电回路1.1.2 逻辑电路部分:自举电容1.1.3 逻辑电路部分:反馈电路1.1.3.1 FB 引脚1.1.3.2 VCC 引脚1.1.3.3 单点接地 1.2 BUCK 电路中&am…

2026/7/5 1:26:28阅读更多 →
AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比 一、评测体系设计与方法论 AI编码助手已成为开发效率的关键杠杆。本次评测聚焦三项主流工具的实际表现。从四个维度建立可复现的量化评测框架。 %%{init: {theme: base}}%% radartitle AI编码助手…

2026/7/5 1:21:28阅读更多 →
PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader 一、训练慢不一定是模型慢 PyTorch 训练时,很多人看到速度慢就先改模型、调 batch size、换显卡。但如果 GPU 利用率忽高忽低,可能瓶颈根本不在模型,而在数据加载。图片解码、文本…

2026/7/5 1:21:28阅读更多 →
AI 科普组件:复杂概念要给读者台阶

AI 科普组件:复杂概念要给读者台阶

AI 科普组件:复杂概念要给读者台阶 一、科普不是把术语换成比喻 AI 科普常把复杂概念换成生活比喻,比如把注意力机制比作划重点,把向量比作坐标。比喻有用,但如果只有比喻,读者可能觉得懂了,实际仍然无法继…

2026/7/5 2:41:32阅读更多 →
小从不知名wordpress开发者推荐

小从不知名wordpress开发者推荐

葛瑞斯WP主题(GraceTheme)——优雅大气的品牌展示型WordPress主题 基本信息 GraceTheme(葛瑞斯WP主题)是一款由华人团队打造的高端原创WordPress主题,官方网站为gracetheme.com。该主题专注于打造"优雅大气"的品牌展示型WordPress主题,设计风…

2026/7/5 2:41:32阅读更多 →
解锁开题高效写作新模式,paperxie助力学子轻松通过论文开题

解锁开题高效写作新模式,paperxie助力学子轻松通过论文开题

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图 开题报告 - PaperXie智能写作PaperXieAi论文智能生成软件,10分钟生成万字毕业论文、期刊论文、文献综述、PPT,Aigc查重、降重报告、文献资料。只需一个标题,从…

2026/7/5 2:41:32阅读更多 →
纯净系统GH0镜像xp win7 win10 win11 自动还原自动安装 集成标准版驱动 纯净安装工具+详细安装教程

纯净系统GH0镜像xp win7 win10 win11 自动还原自动安装 集成标准版驱动 纯净安装工具+详细安装教程

纯净系统GH0镜像xp win7 win10 win11 自动还原自动安装 集成标准版驱动 纯净安装工具详细安装教程 镜像安装工具详细安装教程 更多资料汇总 提取码: dk3h

2026/7/5 2:41:32阅读更多 →
完美搞定微博,2026 批量下载微博内容/图片/视频,导出word和pdf,微博内容发布时间链接/点赞/评论/转发等数据导出excel

完美搞定微博,2026 批量下载微博内容/图片/视频,导出word和pdf,微博内容发布时间链接/点赞/评论/转发等数据导出excel

之前分享过我开发的微博下载工具 完美搞定,2026 批量下载微博内容/图片/视频,导出word和pdf,微博内容发布时间链接/点赞/评论/转发等数据导出excel,今天再整理分享下最新微博内容/图片/视频/发布时间/链接/点赞/评论/转发/阅读数等…

2026/7/5 2:41:32阅读更多 →
本地部署AI编程助手:Codex CLI与Claude Code实战指南

本地部署AI编程助手:Codex CLI与Claude Code实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一个能本地部署、支持批量任务、并且能通过 API 调用的 AI 编程助手,那么 Codex CLI 和 Claude Code 这两个…

2026/7/5 2:36:32阅读更多 →
从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/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/4 2:33:55阅读更多 →