代码随想录二刷 Day05 | 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和,454.四数相加II,383. 赎金信

题目与题解

参考资料:哈希表理论基础

Tips:

  • 一般哈希表都是用来快速判断一个元素是否出现集合里
  • 哈希表生成原理:先通过哈希函数将变量映射为hashcode,如果二者hashcode相同,再通过哈希碰撞方法(拉链法,线性探测法)将新变量的hashcode放入链表或哈希表的其他空位中
  • 常见哈希结构:数组,集合set,映射map

242.有效的字母异位词

题目链接:242.有效的字母异位词

代码随想录题解:​​​​​​​242.有效的字母异位词

解题思路

        翻译过来就是要判断两个字符串中各个字符的数量是否相同,首先排除两个字符串长度不相同的情况。当两个字符串长度相同时,统计它们字符的数量,最简单的做法就是同时遍历两个字符串,先用哈希表记录其中一个字符串中每个字符的数量,然后根据另一个字符串的当前的字符减去哈希表中相应字符对应的数量。最后判断哈希表中每个字符的数量是否正好都为0即可。

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

注意点

        因为这里只需要统计字符的数量,所以哈希表用数组足矣,效率更高。

349. 两个数组的交集

题目链接:349. 两个数组的交集

代码随想录题解:​​​​​​​349. 两个数组的交集

解题思路

        交集是个很典型的集合概念,所以这套题的哈希表用集合非常合适。

        一开始想直接求出两个数组对应的集合,然后再用集合自带的函数求出交集。但是凭空写的时候不知道怎么把数组直接转换为集合,也不知道求交集的函数,于是偷偷看了一眼答案。答案没有用现成函数,所以老老实实手写吧。

        首先遍历nums1,用集合set逐一加入nums1中的元素,得到nums1对应的集合。

        然后设置集合crossSet,遍历nums2,如果nums2的元素也在set中,说明该元素存在交集中,将其加入crossSet。最后遍历crossSet,将其存到数组中,返回数组即可。

class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> set = new HashSet<>();for (int i = 0; i < nums1.length; i++) {set.add(nums1[i]);}Set<Integer> crossSet = new HashSet<>();for (int i = 0; i < nums2.length; i++) {if (set.contains(nums2[i])) {crossSet.add(nums2[i]);}}int[] res = new int[crossSet.size()];int i = 0;for (int item:crossSet) {res[i++] = item;}return res;}
}

注意点

        在Java中,求HashSet的交集可以使用removeAll()方法。这个方法会从当前集合中删除所有包含在指定集合的元素。交集操作完成后,当前集合只保留与指定集合共有的元素。


import java.util.HashSet;public class Main {public static void main(String[] args) {HashSet<Integer> set1 = new HashSet<>();HashSet<Integer> set2 = new HashSet<>();HashSet<Integer> intersection = new HashSet<>();// 填充集合set1.add(1);set1.add(2);set1.add(3);set2.add(2);set2.add(3);set2.add(4);// 交集操作intersection.addAll(set1);intersection.removeAll(set2);set1.removeAll(set2);// 输出结果System.out.println("set1: " + set1); // 会输出 [],因为set1已经被修改System.out.println("set2: " + set2); // 输出 [2, 3, 4]System.out.println("交集: " + intersection); // 输出 [2, 3]}
}

        另外注意一下hashset的用法,加入元素要用add,遍历可以用java for each循环得到所有元素。

        题目有加数字的范围在0-1000之间,这种情况可以用数组替代Set类型,提高效率。

202. 快乐数

题目链接:202. 快乐数

代码随想录题解:​​​​​​​202. 快乐数

解题思路

        这题主要分成两步来写,一步用于计算数字的每一位上的平方和sum,一步用于判断sum是进入了无限循环,还是满足了和为1的要求。判断sum进入循环与否的方式可以用哈希表来完成。

        初始化本轮用于计算的数字num=n,用set记录每一次计算得到的平方和,当num不为1时,计算其每一位上的平方和,得到sum,如果sum不在set中,就把它加入set,否则说明已经出现了循环,该数不是快乐数。

class Solution {public boolean isHappy(int n) {Set<Integer> set = new HashSet<>();int num = n;set.add(num);while (num != 1) {int sum = 0;while (num != 0) {sum += (num%10)*(num%10);num /= 10;}if (set.contains(sum)) return false;else {set.add(sum);num = sum;}}return true;}
}

注意点

        计算平方和的时候,要注意用sum这个临时变量存储结果,当num不为0时,不断对其取余用来计算平方数加到sum上,取完余后不要忘记除以10,最后将sum赋值给num,用于下一轮的计算。

        set中判断元素是否存在用set.contains(element)即可。

1. 两数之和

题目链接:​​​​​​​1. 两数之和

代码随想录题解:​​​​​​​1. 两数之和

解题思路

        同一个元素不能使用两次,还需要查找元素,那最好遍历一次数组完成计算,既提高效率,又防止重复计算。

        用哈希表记录元素值及其对应的下标,但是这里有个小技巧,遍历时在哈希表中记录的不是当前元素值和其下标,而是target减去当前元素后的值和当前元素的下标,这样,往后遍历时,就可以直接通过containsKey判断当前元素是否在哈希表中,如果在,就直接得到前一个元素的下标和当前的下标,返回即可。

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

注意点

        这题非常巧妙,用target-nums[i]一举两得,减少了搜索的时间,保留了需要的下标。

        同样注意一下hashmap的用法,加入元素用map.put(key, value),判断元素是否存在用map.containsKey(key)。

454.四数相加II

题目链接:​​​​​​​454.四数相加II

代码随想录题解:​​​​​​​454.四数相加II

解题思路

        这题跟前一题思路有点类似,但更复杂一些,因为这里要求出所有符合条件的元组数量,不重复不遗漏。

        将四个数组分为两组,先用hashmap记录第一组数据分别有多少种不同的和(key),每个和的数量是多少(value),再遍历第二组数据,每次遍历计算-nums3[i]-nums4[j],并判断它是否在前面的hashmap中,如果在,就把对应的value加入到结果的数量中。最后返回结果即可。

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {Map<Integer, Integer> sum1 = new HashMap<>();for (int i = 0; i < nums1.length; i++) {for (int j = 0; j < nums2.length; j++) {sum1.put(nums1[i]+nums2[j], sum1.getOrDefault(nums1[i]+nums2[j], 0) + 1);}}int count = 0;for (int i = 0; i < nums3.length; i++) {for (int j = 0; j < nums4.length; j++) {int target = -nums3[i]-nums4[j];if (sum1.containsKey(target)) {count += sum1.get(target);}}}return count;}
}

注意点

        用hashmap统计数量的时候,可以用map.getOrDefault(key, 0)的方式,方便在map中找不到元素时就直接加入新元素并数量加一。

383. 赎金信

题目链接:​​​​​​​383. 赎金信

代码随想录题解:​​​​​​​383. 赎金信

解题思路

        这题跟有效字母异位词有点类似,不同之处在于magazine需要的字符数量需要包含ransomNote,而非字符数量相同。

        先用哈希表统计magazine中每个字符的数量,然后遍历ransomNote,在哈希表的基础上,每遍历到一个字符,就在相应字符的数量上减去1,最后统计哈希表中每个字符的数量是不是大于等于0即可。

class Solution {public boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()) return false;Map<Character, Integer> map = new HashMap<>();for (int i = 0; i < magazine.length(); i++) {map.put(magazine.charAt(i), map.getOrDefault(magazine.charAt(i), 0) + 1);}for (int i = 0; i < ransomNote.length(); i++) {char c = ransomNote.charAt(i);if (map.containsKey(c)) {int count = map.get(c) - 1;if (count < 0) return false;else map.put(c, count);} else {return false;}}return true;}
}

注意点

        这题其实也是统计字符数量,所以可以不用hashmap,直接用数组,效率会更高。

今日收获

        复习了一下哈希表的不同用法,数组、集合、映射类型的哈希表都写到了。哈希表常用于变量的数量统计,去重和用空间换时间的快速查找,这里要注意set和map一些对应的用法,不常写容易忘。

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

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

相关文章

四川汇聚荣聚荣科技有限公司是正规的吗?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;越来越多的科技公司如雨后春笋般涌现。然而&#xff0c;在这个信息爆炸的时代&#xff0c;如何判断一家公司是否正规成为了许多人关注的焦点。本文将围绕“四川汇聚荣聚荣科技有限公司是否正规”这一问题展开讨论&#xf…

CSS学习笔记:vw、vh实现移动端适配

移动端适配 移动端即手机端&#xff0c;也称M端 移动端适配&#xff1a;同一套移动端页面在不同屏幕尺寸的手机上可以实现宽度和高度的自适应&#xff0c;也就是页面中元素的宽度和高度可以根据屏幕尺寸的变化等比缩放 之前我在一篇博客中介绍了rem实现移动端适配&#xff0…

CompletableFuture详细讲解

目录 一、基本概念 1.1 异步编程 1.2 CompletableFuture简介 二、创建和完成CompletableFuture 2.1 创建CompletableFuture对象 2.2 手动完成CompletableFuture 2.3 异常完成CompletableFuture 三、异步计算和回调 3.1 异步任务的执行 3.2 处理计算结果 四、组合多个…

Django之文件上传(一)

一、环境搭建 建立项目 django-admin startproject project_demo配置数据库(以MySQL为例) # settings.py DATABASES = {default: {ENGINE: django.db.backends.mysql,NAME: django_file4,USER: root,PASSWORD: 123,HOST: 192.168.31.151,PORT: 3306,} }建立模型 class UploadF…

redis 集群 底层原理以及实操

前言 上篇我们讲解了哨兵集群是怎么回事 也说了对应的leader选举raft算法 也说了对应的slave节点是怎么被leader提拔的 主要是比较优先级 比较同步偏移量 比较runid等等 今天我们再说说,其实哨兵也有很多缺点 虽然在master挂了之后能很快帮我们选举出新的master 但是对于单个ma…

【Spring Cloud】分布式配置

目录 未来的开发场景为什么需要配置中心配置实时生效配置管理流程 开源配置中心基本介绍DisconfSpring Cloud ConfigApolloNacos Spring Cloud Config介绍配置管理工具体系 案例需求编写 Config Server1.创建配置文件2.创建项目3.添加依赖4.添加注解5.修改配置文件application.…

Python OCR 文字识别使用模型:读光-文字识别-行识别模型-中英-通用领域

介绍 什么是OCR&#xff1f; OCR是“Optical Character Recognition”的缩写&#xff0c;中文意为“光学字符识别”。它是一种技术&#xff0c;可以识别和转换打印在纸张或图像上的文字和字符为机器可处理的格式&#xff0c;如计算机文本文件。通过使用OCR技术&#xff0c;可…

在iPhone上恢复误删除的微信聊天记录

想知道是否可以恢复 微信iPhone 上误删除的消息&#xff1f;继续阅读以获取所有相关问题的答案。 过去几年&#xff0c;像微信这样的社交媒体应用为我们的生活增添了不少乐趣。它们让我们可以随时随地与朋友和家人保持联系。 微信是一个简化且热门的通信平台&#xff0c;它允…

数据结构 | 详解二叉树——堆与堆排序

&#x1f95d;堆 堆总是一棵完全二叉树。 大堆&#xff1a;父节点总是大于子节点。 小堆&#xff1a;父节点总是小于子节点。 注意&#xff1a;1.同一个节点下的两个子节点并无要求先后顺序。 2.堆可以是无序的。 &#x1f349;堆的实现 &#x1f334;深度剖析 1.父节点和子…

QT截图程序,可多屏幕截图二,增加调整截图区域功能

上一篇QT截图程序&#xff0c;可多屏幕截图只是实现了最基本的截图功能&#xff0c;虽然能用但是缺点也有&#xff0c;没办法更改选中的区域&#xff0c;这在实际使用时不太方便。这篇增加了这个功能。先看看效果。 实现代码为&#xff1a; 头文件 #ifndef MASKWIDGET_H #de…

Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计

主要内容 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步相量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; ②并采用牛顿-拉夫逊方法进行系统潮流计算&#xff0c;结果作为理论分…

LLAMA3==shenzhi-wang/Llama3-8B-Chinese-Chat。windows安装不使用ollama

创建环境&#xff1a; conda create -n llama3_env python3.10 conda activate llama3_env conda install pytorch torchvision torchaudio cudatoolkit11.7 -c pytorch 安装Hugging Face的Transformers库&#xff1a; pip install transformers sentencepiece 下载模型 ht…

开源一个工厂常用的LIMS系统

Senaite是一款强大且可靠的基于Web的LIMS/LIS系统&#xff0c;采用Python编写&#xff0c;构建在Plone CMS基础架构之上。该系统处于积极开发阶段&#xff0c;在灵活的定制空间中为开发人员提供了丰富的功能。其中&#xff0c;Senaite在处理REST的JSON API上做得出色&#xff0…

python -【二】判断语句

判断语句 一、 布尔类型 True&#xff1a;真(1)False&#xff1a;假(0) 比较运算符 运算符实例1 1 True!1 ! 1 Flase<1 < 1 Flse>1 > 1 Flse<1 < 1 True>1 > 1 True b1 True b2 False print(f"b1值是{b1},类型是{type(b1)}") print(…

【Linux】Socket中的心跳机制(心跳包)

Socket中的心跳机制(心跳包) 1. 什么是心跳机制&#xff1f;(心跳包) 在客户端和服务端长时间没有相互发送数据的情况下&#xff0c;我们需要一种机制来判断连接是否依然存在。直接发送任何数据包可以实现这一点&#xff0c;但为了效率和简洁&#xff0c;通常发送一个空包&am…

npm入门介绍

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于安装、管理和共享 JavaScript 代码包。它是全球最大的软件注册表&#xff0c;拥有数百万个开源包&#xff0c;为开发者提供了丰富的资源和工具。以下是 npm 的详细介绍&#xff1a; 1…

vs工程添加自定义宏

一、简介 用户可以添加自定义宏变量方便工程路径名称的修改和配置 例&#xff1a;$(SolutionDir) 为解决方案路径&#xff0c;$(PojectDir) 为工程所在路径 测试环境&#xff1a;vs2017&#xff0c;qt5.14.0 二、配置 1、打开属性窗口&#xff1a;视图-》其他窗口-》属性管…

四数之和-力扣

本题在三数之和的基础上&#xff0c;再增加一重循环进行解答 首先注意的点是&#xff0c;一级剪枝处理&#xff0c;target > 0 && nums[i] > target 此处只有整数才可剪枝处理&#xff0c;如果target为负数&#xff0c;nums[i] < target&#xff0c;也不能代…

精准操控时间的艺术:JavaScript节流函数的深度探索与实践【含代码示例】

精准操控时间的艺术&#xff1a;JavaScript节流函数的深度探索与实践【含代码示例】 节流基础&#xff1a;概念与作用实现策略&#xff1a;案例展示案例一&#xff1a;基础定时器实现案例二&#xff1a;立即执行版本案例三&#xff1a;使用requestAnimationFrame实现动画节流 功…

蓝桥杯-AB路线(详细原创)

问题描述&#xff1a; 有一个由 N M 个方格组成的迷宫&#xff0c;每个方格写有一个字母 A 或者 B。小蓝站在迷宫左上角的方格&#xff0c;目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。 由于特殊的原因&#xff0c;小蓝的路线必须先走 K 个 A 格子、再…