Java哈希查找(含面试大厂题和源码)

哈希查找(Hash Search)是一种基于哈希表(Hash Table)的数据查找方法。哈希表通过使用哈希函数将键(Key)映射到表中的位置来存储数据,从而实现快速的数据访问。哈希查找的效率通常取决于哈希函数的设计、哈希表的大小以及处理哈希冲突的策略。

哈希查找的工作原理:

  1. 哈希函数:通过哈希函数将键转换为哈希表中的索引。
  2. 存储数据:将数据存储在哈希表的相应位置。
  3. 查找数据:通过键计算哈希值,直接访问数据所在的哈希表位置。
  4. 处理冲突:当两个不同的键产生相同的哈希值时(称为哈希冲突),需要采用某种策略来解决。常见的冲突解决策略包括链地址法(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);}
}

这些题目和源码展示了哈希查找在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive了解系列一

“ 随着智能手机的普及&#xff0c;互联网时代红利的爆发&#xff0c;用户数量和产生的数据也越发庞大。为了解决这个问题&#xff0c;提高数据的使用价值。 Hadoop生态系统就被广泛得到应用。 在早期&#xff0c;Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益…

力扣第20题有效的括号

typedef char STDataType; //动态栈 #define allocator_may_return_null 1typedef struct ST {STDataType* _a;int _top;//栈顶元素int _capacity;//最大容量 }Stack; //初始化栈 void StackInit(Stack *pst);//入栈 void StackPush(Stack* pst, STDataType x);//出栈 void Sta…

英语写作中“大量的”“重大的”“显著的”substantial、considerable、significant的用法

一般“大量的”“重大的”会用a great number of 、a great amount of 、a plenty of 、great等&#xff0c;这些表达都过于trivial &#xff0c;用好substantial、considerable、significant 会对写作增色不少。 一、对于可数事物&#xff0c;用a considerable/substantial n…

小程序变更主体需要多久?

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

每日OJ题_BFS解决最短路①_力扣1926. 迷宫中离入口最近的出口

目录 力扣1926. 迷宫中离入口最近的出口 解析代码 力扣1926. 迷宫中离入口最近的出口 1926. 迷宫中离入口最近的出口 难度 中等 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&…

Hibernate入门经典与注解式开发大全

本博文主要讲解介绍Hibernate框架&#xff0c;ORM的概念和Hibernate入门&#xff0c;相信你们看了就会使用Hibernate了! 什么是Hibernate框架&#xff1f; Hibernate是一种ORM框架&#xff0c;全称为 Object_Relative DateBase-Mapping&#xff0c;在Java对象与关系数据库之间建…

【uniapp踩坑记】使用z-paging组件,微信小程序端加载不出来问题解决

使用z-paging组件&#xff0c;h5端加载正常&#xff0c;微信小程序端显示空白 今天做分页列表&#xff0c;在插件市场找到了z-paging&#xff0c;照着示例代码写了进去&#xff0c;在h5端能正常使用&#xff0c;在小程序端一直显示空白 尝试过以下无效操作&#xff1a; 1.清除所…

Scrapy 框架基础

Scrapy框架基础Scrapy框架进阶 Scrapy 框架基础 【一】框架介绍 【1】简介 Scrapy是一个用于网络爬取的快速高级框架&#xff0c;使用Python编写他不仅可以用于数据挖掘&#xff0c;还可以用于检测和自动化测试等任务 【2】框架 官网链接https://docs.scrapy.org/en/late…

WPS二次开发系列:WPS SDk功能就概览

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 作者通过深度测试使用了WPS SDK提供的Demo&#xff0…

给你的 vscode 扩展增加测试设置

文章目录 1. 目的2. vitest 作为 vscode 扩展单元测试3. vscode-test 集成测试4. 自定义 Runner 集成测试5. 小结 1. 目的 vscode 作为当前最多人使用的编辑器和开发工具&#xff0c;其最强大之处就是有成熟的插件社区&#xff0c;但是使用过程中难免就会遇到插件功能不够称心…

Python 内置函数 format() 详解

在 Python 中&#xff0c;format() 是一个内置函数&#xff0c;用于格式化字符串。它提供了灵活的方式来将变量插入到字符串中&#xff0c;并控制它们的显示格式。让我们深入了解一下这个函数的用法、参数、示例以及注意事项。 1. format() 函数概述 format() 函数是 Python …

SPI 设备驱动编写流程:SPI 设备数据收发处理流程

一. 简介 前面一篇文章学习了SPI设备驱动数据收发过程中&#xff0c;涉及的结构体与函数&#xff0c;文章如下&#xff1a; SPI 设备驱动编写流程&#xff1a;SPI 设备数据收发处理流程中涉及的结构体与函数-CSDN博客 本文学习SPI设备驱动中数据收发处理过程。 二. SPI 设备…

P8649 [蓝桥杯 2017 省 B] k 倍区间(同余定理)

# [蓝桥杯 2017 省 B] k 倍区间 ## 题目描述 给定一个长度为 $N$ 的数列&#xff0c;$A_1,A_2, \cdots A_N$&#xff0c;如果其中一段连续的子序列 $A_i,A_{i1}, \cdots A_j(i \le j)$ 之和是 $K$ 的倍数&#xff0c;我们就称这个区间 $[i,j]$ 是 $K$ 倍区间。 你能求出数列…

ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…

#381. 四边形继承练习

太爽了 甚至还现学了叉积判断线段是否相交和求面积的方法 先给出我的代码&#xff1a; #include <iostream> #include <vector> #include <iomanip> #include <cmath>using namespace std;//下面需要补充多个类的声明及实现代码 const double EPS 1…

创新营销利器:淘宝扭蛋机小程序开发全解析

在数字化浪潮的推动下&#xff0c;淘宝扭蛋机小程序的开发成为了一种全新的购物体验。它巧妙地将传统扭蛋机的乐趣与移动技术的便捷相结合&#xff0c;为用户带来了前所未有的惊喜与互动。 淘宝扭蛋机小程序的开发&#xff0c;不仅是一次技术的革新&#xff0c;更是一次购物方…

【基于HTML5的网页设计及应用】——事件代理.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

每个人都可以做一个赚钱的社群

如何创建并运营一个赚钱的社群 一、引言 大家好&#xff0c;今天&#xff0c;我想和大家分享一下如何创建并运营一个赚钱的社群。我的分享目的是希望能够持续输出有价值的内容。 二、心态建设 1. 重要性&#xff1a;创业心态与平常心 在开始社群运营之前&#xff0c;我们需…

在线知识库如何从零开始搭建?这篇文章来教你!

引言&#xff1a; 有没有想过把那些零散在脑海中的点点滴滴整理起来&#xff0c;建立一个属于自己的在线知识库&#xff1f;无论是个人学习&#xff0c;团队协作&#xff0c;还是企业管理&#xff0c;一个良好的知识库都能帮我们更高效地存储和分享知识。如果你还在为“怎么建知…