本文档涵盖了技术面试中常见的基于哈希表的问题及其解决方案。哈希表是一种重要的数据结构,以其O(1)平均时间复杂度的查找、插入和删除操作而闻名,这使得它们在高效解决各种算法问题时特别有用。
有关哈希表实现详情,请参阅哈希表。
来源
哈希表擅长解决以下几类问题:
下图展示了哈希表问题的常见模式结构:
来源:leetcode/hash-table/ContainsDuplicate.java leetcode/hash-table/FirstUniqueCharacterInAString.java leetcode/hash-table/EncodeAndDecodeTinyURL.java
给定一个整数数组,判断数组中是否存在重复元素。如果数组中存在至少出现两次的值,则函数应返回true;如果每个元素都互不相同,则返回false。
该解决方案使用哈希表来跟踪遍历数组时遇到的元素。对于每个元素,我们检查它是否已存在于哈希表中——如果存在,则找到了重复项;如果不存在,则将其添加到哈希表。
该解决方案在containsDuplicate方法中实现:
HashMap来跟踪元素true(检测到重复项)false(无重复项)时间复杂度:O(n),其中 n 是数组长度 空间复杂度:O(n),用于在哈希映射中存储元素
来源:leetcode/hash-table/ContainsDuplicate.java4-17
给定一个字符串,找到第一个不重复的字符并返回其索引。如果不存在此类字符,则返回 -1。
此问题采用两趟遍历方法,使用哈希表来计算字符出现次数:
该解决方案使用HashMap类来存储字符索引:
时间复杂度:O(n),其中 n 是字符串长度(两次遍历数据) 空间复杂度:O(k),其中 k 是字符集的大小(对于小写字母最多为 26)
来源:leetcode/hash-table/FirstUniqueCharacterInAString.java12-34
设计一个类似 TinyURL 的短链接服务,它能为较长的 URL 提供缩短的 URL。该服务应支持将 URL 编码为短形式,以及将短 URL 解码回其原始形式。
该实现使用哈希表来维护生成的短 URL 及其对应的原始 URL 之间的映射:
该解决方案利用了:
HashMap,用于存储短 URL 键和原始 URL 之间的映射键生成方法根据计数器值,使用预定义字符集中的字符创建唯一字符串。
时间复杂度
空间复杂度:O(n),其中 n 是已编码 URL 的数量
来源:leetcode/hash-table/EncodeAndDecodeTinyURL.java8-37
下表总结了在面试问题中使用哈希表的关键技巧:
| 技术 | 目的 | 示例 |
|---|---|---|
| 跟踪已见元素 | 检测重复项 | ContainsDuplicate |
| 计数频率 | 跟踪元素出现次数 | FirstUniqueCharacterInAString |
| 键值映射 | 创建值之间的关联 | EncodeAndDecodeTinyURL |
| 两趟遍历法 | 先构建映射,然后查询 | FirstUniqueCharacterInAString |
哈希表解决方案通常以空间换取时间
来源:leetcode/hash-table/ContainsDuplicate.java leetcode/hash-table/FirstUniqueCharacterInAString.java leetcode/hash-table/EncodeAndDecodeTinyURL.java
哈希表问题在技术面试中频繁出现,因为它们考察候选人以下能力:
在处理哈希表问题时,请考虑:
来源:leetcode/hash-table/ContainsDuplicate.java leetcode/hash-table/FirstUniqueCharacterInAString.java leetcode/hash-table/EncodeAndDecodeTinyURL.java