Java哈希查找(含面试大厂题和源码)
哈希查找(Hash Search)是一种基于哈希表(Hash Table)的数据查找方法。哈希表通过使用哈希函数将键(Key)映射到表中的位置来存储数据,从而实现快速的数据访问。哈希查找的效率通常取决于哈希函数的设计、哈希表的大小以及处理哈希冲突的策略。
哈希查找的工作原理:
- 哈希函数:通过哈希函数将键转换为哈希表中的索引。
- 存储数据:将数据存储在哈希表的相应位置。
- 查找数据:通过键计算哈希值,直接访问数据所在的哈希表位置。
- 处理冲突:当两个不同的键产生相同的哈希值时(称为哈希冲突),需要采用某种策略来解决。常见的冲突解决策略包括链地址法(Chaining)和开放寻址法(Open Addressing)。
哈希查找的优缺点:
优点:
- 平均情况下,哈希查找可以实现接近 O(1) 的时间复杂度。
- 哈希表可以高效地支持大量的数据插入、查找和删除操作。
缺点:
- 哈希表的性能依赖于哈希函数的设计和冲突解决策略。
- 哈希表可能需要额外的存储空间来处理冲突。
- 哈希查找不保留元素的顺序。
哈希查找的Java实现:
import java.util.HashMap;
import java.util.Map;public class HashSearch {private Map<Integer, String> hashTable;public HashSearch() {hashTable = new HashMap<>();}public void insert(int key, String value) {hashTable.put(key, value);}public String search(int key) {return hashTable.get(key);}public static void main(String[] args) {HashSearch search = new HashSearch();search.insert(1, "apple");search.insert(2, "banana");search.insert(3, "cherry");String result = search.search(2);System.out.println("Value for key 2: " + result);}
}
在面试中,了解哈希查找的原理和实现是非常重要的,尤其是当面试官询问关于数据结构和算法的问题时。通过实现哈希查找,可以展示你对基本数据结构和算法的掌握程度。希望这些知识点和示例代码能够帮助你更好地准备面试!哈希查找是大厂面试中常见的题目类型,尤其是在处理大量数据和需要高效查找的场景中。以下是三道可能出现在大厂面试中的与哈希查找相关的编程题目,以及相应的Java源码实现。
题目 1:设计一个 LRU 缓存
描述:
设计一个 LRU(Least Recently Used)缓存,它应该支持以下操作:获取数据 get 和写入数据 put。
示例:
输入: ["LRUCache", "put", "put", "get", "put", "get", "get"][ [2], [1, 1], [2, 2], [1], [3, 3], [2], [4]输出: [null, null, null, 1, null, 2, 3]
Java 源码:
import java.util.HashMap;
import java.util.Map;public class LRUCache {private final int capacity;private final Map<Integer, Integer> cache;private final DoublyLinkedList lru;public LRUCache(int capacity) {this.capacity = capacity;this.cache = new HashMap<>();this.lru = new DoublyLinkedList();}public int get(int key) {if (cache.containsKey(key)) {lru.moveToHead(key);return cache.get(key);}return -1;}public void put(int key, int value) {if (cache.containsKey(key)) {cache.put(key, value);lru.moveToHead(key);} else {if (cache.size() >= capacity) {int last = lru.removeTail();cache.remove(last);}cache.put(key, value);lruaddToHead(key);}}private void lruaddToHead(int key) {Node newNode = new Node(key);lru.addFirst(newNode);}private void lru.moveToHead(int key) {Node node = lru.find(key);if (node != null) {lru.remove(node);lruaddToHead(key);}}private void lru removeTail() {if (!lru.isEmpty()) {lru.removeLast();}}private class DoublyLinkedList {private Node head, tail;DoublyLinkedList() {head = new Node(0, 0);tail = new Node(0, 0);head.next = tail;tail.prev = head;}void addFirst(Node node) {node.next = head.next;node.prev = head;head.next.prev = node;head.next = node;}void remove(Node node) {node.prev.next = node.next;node.next.prev = node.prev;}void removeLast() {if (tail.prev != head) {Node last = tail.prev;remove(last);}}Node find(int key) {Node current = head.next;while (current != tail) {if (current.key == key) {return current;}current = current.next;}return null;}}private class Node {int key, value;Node prev, next;Node(int key, int value) {this.key = key;this.value = value;}}public static void main(String[] args) {LRUCache lru = new LRUCache(2);lru.put(1, 1);lru.put(2, 2);System.out.println(lru.get(1)); // 返回 1lru.put(3, 3); // 该操作会使得关键字 2 作废System.out.println(lru.get(2)); // 返回 -1 (未找到)System.out.println(lru.get(3)); // 返回 3lru.put(4, 4); // 该操作会使得关键字 1 作废System.out.println(lru.get(1)); // 返回 -1 (未找到)System.out.println(lru.get(3)); // 返回 3System.out.println(lru.get(4)); // 返回 4}
}
题目 2:字符串哈希映射
描述:
给定一个字符串,将所有出现的大写字母映射到一个新字符串中,映射规则为 ‘A’ -> ‘a’,‘B’ -> ‘b’,…,‘Z’ -> ‘z’。
示例:
输入: "LEETCODEISHIRING"
输出: "ldecodishngi"
Java 源码:
public class MapStringToHash {public String stringHashMapping(String s) {StringBuilder result = new StringBuilder();for (char ch : s.toCharArray()) {if (Character.isUpperCase(ch)) {result.append((char) (ch + 32));} else {result.append(ch);}}return result.toString();}public static void main(String[] args) {MapStringToHash solution = new MapStringToHash();String input = "LEETCODEISHIRING";String output = solution.stringHashMapping(input);System.out.println("Mapped string: " + output);}
}
题目 3:两个字符串的哈希映射
描述:
给定两个字符串,计算它们在哈希表中的相似度。如果一个字符串的字符可以通过另一个字符串中的字符进行替换得到,那么这两个字符串是相似的。
示例:
输入: s1 = "great", s2 = "raste"
输出: true
Java 源码:
import java.util.HashSet;
import java.util.Set;public class HashMappingTwoStrings {public boolean areAlmostEqual(String s1, String s2) {if (s1.length() != s2.length()) {return false;}Set<Character> set1 = new HashSet<>();Set<Character> set2 = new HashSet<>();for (int i = 0; i < s1.length(); i++) {set1.add(s1.charAt(i));set2.add(s2.charAt(i));}return set1.equals(set2);}public static void main(String[] args) {HashMappingTwoStrings solution = new HashMappingTwoStrings();String s1 = "great";String s2 = "raste";boolean result = solution.areAlmostEqual(s1, s2);System.out.println("Strings are almost equal: " + result);}
}
这些题目和源码展示了哈希查找在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!
相关文章:
Java哈希查找(含面试大厂题和源码)
哈希查找(Hash Search)是一种基于哈希表(Hash Table)的数据查找方法。哈希表通过使用哈希函数将键(Key)映射到表中的位置来存储数据,从而实现快速的数据访问。哈希查找的效率通常取决于哈希函数…...

c++中常用库函数
大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…...

Scrapy框架 进阶
Scrapy框架基础Scrapy框架进阶 【五】持久化存储 命令行:json、csv等管道:什么数据类型都可以 【1】命令行简单存储 (1)语法 Json格式 scrapy crawl 自定义爬虫程序文件名 -o 文件名.jsonCSV格式 scrapy crawl 自定义爬虫程…...

ubuntu22安装snipaste
Ubuntu 22.04 一、Snipaste 介绍和下载 Snipaste 官网下载链接: Snipaste Downloads 二、安装并使用 Snipaste # 1、进入Snipaste-2.8.9-Beta-x86_64.AppImage 目录(根据自己下载目录) cd /home/jack/Downloads/softwares/AppImage# 2、Snipaste-2.8.9-…...

spring-cloud微服务openfeign
Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便 优势,openfeign可以做到使用HTTP请求远程服务时就像洞用本地方法一样的体验,开发者完全感…...

小程序变更主体需要多久?
小程序迁移变更主体有什么作用?小程序迁移变更主体的好处有很多哦!比如可以获得更多权限功能、公司变更或注销时可以保证账号的正常使用、收购账号后可以改变归属权或使用权等等。小程序迁移变更主体的条件有哪些?1、新主体必须是企业主体&am…...

19 Games101 - 笔记 - 相机与透镜
**19 ** 相机与透镜 目录 摘要一 照相机主要部分二 小孔成像与视场(FOV)三 曝光(Exposure)四 景深(Depth of Field)总结 摘要 虽说照相机与透镜属于相对独立的话题,但它们的确是计算机图形学当中的一部分知识。在过往的十多篇笔记中,我们学习的都是如…...

Flink入门学习 | 大数据技术
⭐简单说两句⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &…...

Arthas实战教程:定位Java应用CPU过高与线程死锁
引言 在Java应用开发中,我们可能会遇到CPU占用过高和线程死锁的问题。本文将介绍如何使用Arthas工具快速定位这些问题。 准备工作 首先,我们创建一个简单的Java应用,模拟CPU过高和线程死锁的情况。在这个示例中,我们将编写一个…...

HTML制作跳动的心形网页
作为一名码农 也有自己浪漫的小心思嗷~ 该网页 代码整体难度不大 操作性较强 祝大家都幸福hhhhh 效果成品: 全部代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE> 一个…...

如何在Odoo 17 销售应用中使用产品目录添加产品
Odoo,作为一个知名的开源ERP系统,发布了其第17版,新增了多项功能和特性。Odoo 17包中的一些操作简化了,生产力提高了,用户体验也有了显著改善。为了为其用户提供新的和改进的功能,Odoo不断进行改进和增加新…...
为什么pdf拆分出几页之后大小几乎没有变化
PDF 文件的大小在拆分出几页之后几乎没有变化可能有几个原因: 图像压缩: 如果 PDF 文件中包含图像,而这些图像已经被压缩过,拆分后的页面依然会保留这些压缩设置,因此文件大小可能不会显著变化。 文本和矢量图形: PDF 文件中的文…...

如何在 VM 虚拟机中安装 OpenEuler 操作系统保姆级教程(附链接)
一、VMware Workstation 虚拟机 若没有安装虚拟机的可以参考下篇文章进行安装: 博客链接https://eclecticism.blog.csdn.net/article/details/135713915 二、OpenEuler 镜像 点击链接前往官网 官网 选择第一个即可 三、安装 OpenEuler 打开虚拟机安装 Ctrl …...

(六)PostgreSQL的组织结构(3)-默认角色和schema
PostgreSQL的组织结构(3)-默认角色和schema 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:57771 默认角色 Post…...
DockerFile定制镜像
dockerfile 简介 Dockerfile 是⼀个⽤来构建镜像的⽂本⽂件,⽂本内容包含了⼀条条构建镜像所需的指令和 说明,每条指令构建⼀层,最终构建出⼀个新的镜像。 docker镜像的本质是⼀个分层的⽂件系统 centos的iso镜像⽂件是包含bootfs和rootfs…...

Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
个人主页: 进朱者赤 阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) 引言 在Java中,并发编程一直是一个重要的领域,而JDK 8中的java.u…...
岛屿个数(dfs)
[第十四届蓝桥杯省B 岛屿个数] 小蓝得到了一副大小为 M N MN MN 的格子地图,可以将其视作一个只包含字符 0 0 0(代表海水)和 1 1 1(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛…...
【C++造神计划】运算符
1 赋值运算符 赋值运算符的功能是将一个值赋给一个变量 int a 5; // 将整数 5 赋给变量 a 运算符左边的部分叫作 lvalue(left value),右边的部分叫作 rvalue(right value) 左边 lvalue 必须是一个变量 右边 rval…...

Cortex-M3/M4处理器的bit-band(位带)技术
ARM Cortex-M3/M4的位带(Bit-Band)技术是一种内存映射技术,它允许对单个位进行直接操作,而不需要对整个字(通常是32位)进行操作。这项技术主要用于对特定的位进行高效的读写,特别是在需要对GPIO…...

【TOP】IEEE旗下1区,影响因子将破8,3个月录用,CCF推荐,性价比高!
计算机类 ● 好刊解读 IEEE出版社、中科院2区TOP,CCF推荐,今天推荐的期刊可谓buff叠满,好刊质量靠谱,有意向评职晋升毕业作者可重点关注: 01 期刊简介 ✅出版社:IEEE ✅影响因子:7.5-8.0 ✅…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...