【哈希表专题】(1. 两数之和 面试题 01.02. 判定是否互为字符重排 217. 存在重复元素 219. 存在重复元素 II 49. 字母异位词分组)

文章目录

  • 哈希表
    • 1. 两数之和
    • 面试题 01.02. 判定是否互为字符重排
    • 217. 存在重复元素
    • 219. 存在重复元素 II
    • 49. 字母异位词分组


哈希表

哈希表是什么:存储数据的容器

作用:快速查找某个元素。O(1)

当我们需要频繁的查找某一个数的时候,可以使用哈希表。

如何用哈希表

  1. 容器(哈希表)
  2. 用数组模拟简易哈希表
    (字符串中的“字符”)
    (数据范围很小的时候)

1. 两数之和

题目链接: leetcode1. 两数之和

在这里插入图片描述
解法一:暴力解法

  1. 先固定其中一个数
  2. 依次与该数之前的数相加

代码:

class Solution {public int[] twoSum(int[] nums, int target) {int[] ret = new int[2];for (int i = 0; i < nums.length; i++) {for (int j = i - 1; j >= 0; j--) {if (nums[i] + nums[j] == target) {ret[0] = i;ret[1] = j;return ret;}}}return ret;}
}

twoSum该方法接收两个参数:一个整数数组nums和一个整数target。方法的目的是在nums数组中找到两个数,使它们的和等于target,并返回这两个数的索引。

解析:

  1. 创建一个长度为2的整数数组ret,用于存储找到的两个数的索引。
  2. 使用两层for循环遍历nums数组。外层循环遍历数组中的每个元素,内层循环从当前元素的前一个元素开始向前遍历。
  3. 如果在内层循环中找到两个数的和等于target,将它们的索引分别存储在ret数组的第0个和第1个位置,并返回ret数组。
  4. 如果遍历完整个数组都没有找到满足条件的两个数,返回ret数组(此时ret数组中的元素未被修改)。

解法二:哈希表

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> hash = new HashMap<>();for(int i = 0; i < nums.length;i++){int x = target - nums[i];if(hash.containsKey(x)){return new int[]{i,hash.get(x)};}hash.put(nums[i],i);}return new int[]{-1,-1};}
}

twoSum该方法接收两个参数:一个整数数组nums和一个整数target。方法的目的是在nums数组中找到两个数,使它们的和等于target,并返回这两个数的索引。

首先,创建一个HashMap(名为hash)来存储数组中的元素及其对应的索引。然后,遍历数组nums,对于每个元素nums[i],计算target减去nums[i]的值(x)。接着,检查hash中是否包含键x。如果包含,说明找到了两个数的和等于target,返回这两个数的索引(i和hash.get(x))。如果不包含,将当前元素nums[i]及其索引i添加到hash中。

如果遍历完数组后仍未找到满足条件的两个数,返回一个包含两个-1的数组。

面试题 01.02. 判定是否互为字符重排

题目链接: 面试题 01.02. 判定是否互为字符重排

在这里插入图片描述

CheckPermutation该方法接受两个字符串参数s1s2,并返回一个布尔值。

方法的功能是检查两个字符串是否为彼此的排列(permutation)。它首先检查两个字符串的长度是否相等,如果不相等则直接返回false。然后,它创建一个长度为26的整型数组hash,用于记录每个字符出现的次数。

接下来,通过遍历字符串s1,将每个字符对应的位置在hash数组中加一。然后,再遍历字符串s2,将每个字符对应的位置在hash数组中减一。如果在遍历过程中发现某个字符在hash数组中的值小于零,说明该字符在s2中出现的次数超过了在s1中出现的次数,因此返回false

如果遍历完两个字符串后没有发现任何问题,说明两个字符串是彼此的排列,返回true

以下是代码的解析:

class Solution {public boolean CheckPermutation(String s1, String s2) {if (s1.length() != s2.length()) {return false;}int[] hash = new int[26];for (int i = 0; i < s1.length(); i++) {hash[s1.charAt(i) - 'a']++;}for (int i = 0; i < s2.length(); i++) {hash[s2.charAt(i) - 'a']--;if (hash[s2.charAt(i) - 'a'] < 0) {return false;}}return true;}
}

217. 存在重复元素

题目链接: 217. 存在重复元素

在这里插入图片描述

class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> hash = new HashSet<>();for(int s : nums){if(hash.contains(s)){return true;}hash.add(s);}return false;}
}

containsDuplicate该方法接受一个整数数组nums作为参数。方法的目的是检查数组中是否存在重复的元素。

代码中使用了一个HashSet来存储已经遍历过的元素。对于数组中的每个元素s,首先检查HashSet中是否已经包含了该元素。如果包含,说明存在重复元素,返回true。如果不包含,将该元素添加到HashSet中。

如果遍历完整个数组后都没有发现重复元素,则返回false

219. 存在重复元素 II

题目链接: 219. 存在重复元素 II

在这里插入图片描述
在这里插入图片描述

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer,Integer> hash = new HashMap<>();for(int i = 0; i < nums.length; i++){if(hash.containsKey(nums[i])){if(i - hash.get(nums[i]) <= k){return true;}}hash.put(nums[i],i);}return false;}
}

这段代码的功能是检查一个整数数组 nums 中是否存在两个相同的元素,且这两个相同元素的索引之间的差值不超过一个给定的整数 k

具体来说,方法 containsNearbyDuplicate 接受两个参数:

  1. int[] nums: 一个整数数组。
  2. int k: 一个非负整数,表示允许的最大索引差。

方法通过使用一个哈希表(在 Java 中是 HashMap)来跟踪每个数字最后出现的位置。算法如下:

  1. 初始化一个空的 HashMap,用于存储数组中的数字及其对应的最新索引。

  2. 遍历数组 nums 中的每个数字 nums[i]

  3. 对于每个数字 nums[i],检查它是否已经在 HashMap 中存在:

    • 如果不存在,将该数字和其索引 i 添加到 HashMap 中。
    • 如果存在,获取该数字之前记录的索引 lastIndex,并计算当前索引 ilastIndex 的差值。
  4. 如果这个差值小于或等于 k,则返回 true,表示找到了两个索引差不超过 k 的相同元素。

  5. 如果遍历完整个数组后没有找到这样的元素对,则返回 false

这个方法可以用于解决一些与数组中重复元素位置有关的问题,例如在滑动窗口内查找重复项等。

49. 字母异位词分组

题目链接: 49. 字母异位词分组

在这里插入图片描述

  1. 算法概述

    • 遍历输入字符串列表。
    • 对于每个字符串:
      • 将其转换为字符数组。
      • 对字符数组进行排序。
      • 创建一个键,将排序后的字符数组转换回字符串。
      • 如果该键尚不存在于映射中,则为该键创建一个新列表。
      • 将原始字符串添加到与该键对应的列表中。
    • 从映射中提取结果,返回值为一组同字母异序词的列表。
  2. 解释

    • 代码使用一个名为 hashMap<String, List<String>> 来存储同字母异序词。
    • 对于每个输入字符串 s
      • s 转换为字符数组(tmp)。
      • 对字符数组进行排序。
      • 创建一个键,将排序后的字符数组转换回字符串。
      • 如果该键尚不存在于映射中,则为该键创建一个新列表。
      • s 添加到与该键对应的列表中。
    • 最后,从映射中返回值(同字母异序词的列表)。
  3. 示例

    • 给定输入:strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
    • 输出:[["bat"], ["nat", "tan"], ["ate", "eat", "tea"]]
  4. 约束条件

    • 1 <= strs.length <= 10^4
    • 0 <= strs[i].length <= 100
    • strs[i] 由小写英文字母组成。
  5. 判断两个字符串是否是字母异位词

  6. 分组

在这里插入图片描述
在这里插入图片描述

class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>> hash = new HashMap<>();// 1.把所有的字符异位词分组for(String s : strs){char[] tmp = s.toCharArray();Arrays.sort(tmp);String key = new String(tmp);if(!hash.containsKey(key)){hash.put(key,new ArrayList());}hash.get(key).add(s);}//2. 提取结果return new ArrayList(hash.values());}
}

代码解释:

1. 定义类和方法:

class Solution {  public List<List<String>> groupAnagrams(String[] strs) {

这里定义了一个名为Solution的类,并在其中定义了一个名为groupAnagrams的公共方法,该方法接受一个字符串数组strs作为参数,并返回一个二维列表,其中每个内部列表都包含一组字符异位词。
2. 初始化哈希表:

Map<String,List<String>> hash = new HashMap<>();

使用Java的HashMap数据结构来存储分组。其中键(key)是排序后的字符串,值(value)是一个列表,包含所有与该键对应的原始字符串(即字符异位词)。

3. 分组字符异位词:

for(String s : strs){  char[] tmp = s.toCharArray();  Arrays.sort(tmp);  String key = new String(tmp);  if(!hash.containsKey(key)){  hash.put(key,new ArrayList());  }  hash.get(key).add(s);  
}

对于strs数组中的每个字符串s:

  • 首先,将字符串转换为字符数组tmp
  • 然后,对字符数组进行排序,以消除字符顺序的影响。
  • 接着,将排序后的字符数组转换回字符串,作为哈希表的键(key)。
  • 如果哈希表中还没有这个键,则创建一个新的空列表作为值,并将其添加到哈希表中。
  • 最后,将原始字符串s添加到与该键对应的列表中。

4. 提取结果:

return new ArrayList(hash.values());

将哈希表中的所有值(即所有字符异位词的列表)提取出来,并放入一个新的列表中。这个新列表就是最终的结果,它包含了所有分组后的字符异位词。

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

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

相关文章

图像拼接——最小割准则提取拼接缝

一、最大流问题与Ford-Fulkerson算法介绍 二、最大流与最小割 显然,我们有对任意一个割,穿过该割的净流量上界就是该割的容量,即不可能超过割的容量。所以网络的最大流必然无法超过网络的最小割。最小割是指割的容量最小,最大流是指网络当中最大的净流量,简单的例子s是水龙…

【蓝桥备赛】异或和——树状数组、DFS

题目链接 异或和 思路分析 树上每个点都有一个点权&#xff0c;对树上的更新操作是修改指定点的点权&#xff0c;查询操作是查询指定点为根结点的子树点权异或和。 这里的这些操作都和树状数组的单点修改和区间查询非常相似&#xff0c;即我们在修改一个点时&#xff0c;同时…

蓝桥杯真题:递增序列

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main {public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横…

SAP新的扩展策略

在软件即服务&#xff08;SaaS&#xff09;应用的推动下&#xff0c;SAP Cloud优先的战略非常明显&#xff0c;随之带来的是SAP Clean core的战略&#xff0c;从经典的 ABAP 可扩展性模式转变为 SAP S/4HANA 现代可扩展性模式。那么Clean core战略到底是什么&#xff1f;新的扩…

基于向量数据库搭建自己的搜索引擎

前言【基于chatbot】 厌倦了商业搜索引擎搜索引擎没完没了的广告&#xff0c;很多时候&#xff0c;只是需要精准高效地检索信息&#xff0c;而不是和商业广告“斗智斗勇”。以前主要是借助爬虫工具&#xff0c;而随着技术的进步&#xff0c;现在有了更多更方便的解决方案&…

LongAdder 和 Striped64 基础学习

cs&#xff0c;表示 Cell 数组的引用&#xff1b;b&#xff0c;表示获取的 base 值&#xff0c;类似于 AtomicLong 中全局变量的 value 值&#xff0c;在没有竞争的情况下数据直接累加到 base 上&#xff0c;或者扩容时&#xff0c;也需要将数据写入到 base 上&#xff1b;v&am…

Linux第2课Windows下的环境配置-虚拟机安装

文章目录 Linux第2课Windows下的环境配置-虚拟机安装一、VMware虚拟机的安装&#xff08;一&#xff09;安装VMware&#xff08;二&#xff09;启动电脑本地的VMware相关服务 二、VirtualBox安装 Linux第2课Windows下的环境配置-虚拟机安装 本节课程提供了两种虚拟机的安装方法…

个人医疗开支预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 随着医疗成本的持续上涨&#xff0c;个人医疗开支成为一个重要议题。理解影响医疗费用的多种因素对于医疗保险公司、政府机构以及个人…

磁环的使用方法

磁环的使用方法 磁环的工作原理共模滤波用法差模滤波用法各种材料磁环的对应频率磁环的感量计算 磁环的工作原理 共模滤波用法 差模滤波用法 各种材料磁环的对应频率 磁环的感量计算

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

【MATLAB源码-第177期】基于matlab的蜘蛛蜂优化算法(SWO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜘蛛蜂优化算法&#xff08;Spider Wasp Optimization, SWO&#xff09;是一种启发式算法&#xff0c;它受到自然界中蜘蛛和蜂这两种生物的行为模式启发而开发。这一算法主要模拟了蜘蛛捕食与蜂群社会行为之间的相互作用&…

网络以太网之(1)基础概念

网络以太网之(1)基础概念 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

C语言-----数据在内存中的存储(1)

1.整数在内存中的存储 我们之前就了解过整数的二进制写法分别有3种&#xff0c;分别为原码&#xff0c;反码&#xff0c;补码。整型在内存中存储的是补码。 原码&#xff0c;反码&#xff0c;补码都有自己的符号位和数值位&#xff0c;符号位为1时&#xff0c;则表示负数&…

【Docker笔记05】【网络模式】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、简单介…

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分&#xff1a;第一个部分是和…

基于springboot实现教师人事档案管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线商城系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本ONLY在线商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理…

第六期丨酷雷曼无人机技能培训

第6期无人机技能提升培训 盼望着盼望着&#xff0c;第六期无人机技能提升培训会终于如期和大家见面了。 2024年1月1日&#xff0c;国务院、中央军事委员会颁布《无人驾驶航空器飞行管理暂行条例》&#xff0c;对民用无人机飞行活动实施更为严格的规范约束&#xff0c;越来越多…

阿里云服务器安装Java开发环境最佳实践

服务器环境安装 环境依赖服务器配置配置SSH登录打开安全配置端口远程连接配置秘钥 Linux服务器常用指令向远程服务器传送文件systemctl 相关 安装MySql安装步骤step1 检查并清除以前的mysql相关文件step2 安装step3 MySQL参数配置step4 设置开机启动step5 初始化数据库step6配置…

ABAP开发中常用弹窗的应用详解

在ABAP程序设计中为提示和交互的需要会经常用到弹窗&#xff0c; 所谓弹窗就是弹出一个框&#xff0c;告诉用户什么事情、需要确认什么、或者让用户输入什么内容等等&#xff0c;它价值在于通过提示、提醒、警告&#xff0c;帮助用户顺利完成业务流程中的必要操作或给用户提供实…