【哈希表专题】(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,一经查实,立即删除!

相关文章

LeetCode-Java:135.分发糖果

文章目录 题目解① 穷举法&#xff0c;用时3ms&#xff0c;超过26.93%②穷举法改进&#xff0c;用时2ms&#xff0c;超过97.78% 题目 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个…

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

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

速盾:cdn高防御服务器租用有哪些好处

随着互联网的发展&#xff0c;网络安全问题日益突出。攻击者利用各种手段不断对网站进行攻击&#xff0c;给网站的安全运行带来威胁。为了保障网站的正常运行和数据的安全&#xff0c;越来越多的网站开始租用CDN高防御服务器。那么&#xff0c;租用CDN高防御服务器有哪些好处呢…

【蓝桥备赛】异或和——树状数组、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 数据一致…

软考之零碎片段记录(五)

一、设计模式 1.策略模式 可在运行时改变行为和算法。这种类型的设计模式属于行为模式。使得代码更加灵活和可维护。 2. 命令模式 将请求封装成独立的对象并通过参数传递。属于行为模式。 3. 观察者模式 当对象状态改变时&#xff0c;依赖于它的对象都会被通知并进行更新…

Java操作hdfs,总是报ClosedChannelException

现象 public boolean uploadFile(MultipartFile file, String dst) {try {long start System.currentTimeMillis();// 创建Hadoop配置对象Configuration config new Configuration();config.set("fs.defaultFS", hdfsUri);Path dstPath new Path(ROOT_PATH dst)…

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

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

Mac brew 安装软件

Mac brew 安装软件 homebrew 速度慢 将brew 切换到国内镜像源 # 速度一般 # 步骤一 cd "$(brew --repo)" git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git# 步骤二 cd "$(brew --repo)/Library/Taps/homebrew/homebr…

网络以太网之(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;则表示负数&…

os模块篇(十四)

文章目录 os.renames(old, new)os.replace(src, dst, *, src_dir_fdNone, dst_dir_fdNone)os.rmdir(path, *, dir_fdNone)os.scandir(path.)os.stat(path, *, dir_fdNone, follow_symlinksTrue)os.statvfs(path) os.renames(old, new) os.renames(old, new) 是 Python 的 os 模…

一些常见的Prometheus+Grafana问题和答案:

什么是Prometheus&#xff1f;它的主要功能是什么&#xff1f; Prometheus是一个开源的系统监控和报警工具。它通过收集和存储时间序列数据&#xff0c;提供了强大的查询语言和灵活的报警规则&#xff0c;可以帮助监控和分析系统的性能指标。 Prometheus的数据模型是什么样的…