代码随想录二刷 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一些对应的用法,不常写容易忘。
相关文章:

代码随想录二刷 Day05 | 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和,454.四数相加II,383. 赎金信
题目与题解 参考资料:哈希表理论基础 Tips: 一般哈希表都是用来快速判断一个元素是否出现集合里哈希表生成原理:先通过哈希函数将变量映射为hashcode,如果二者hashcode相同,再通过哈希碰撞方法(拉链法&…...

2024年四川省三支一扶报名流程图解✅
2024年四川省三支一扶报名流程图解✅ 🔴时间安排 1、报名时间:5月31日—6月4日17:00 2、资格初审时间:5月31日—6月5日17:00 3、准考证打印时间:6月25日—6月29日 4、笔试时间:6月30日 5、笔试成绩:7…...

js Dom基础
获取元素 1、getElementById() 通过id属性获取一个元素节点对象 <div id"div1"></div> <script> var div1 document.getElementById(div1) </script> 2、 getElementsByTagName()可以根据标签名来获取一组元素节点对象 这个方法会给我们返…...

pytest识别测试用例的机制以及和unittest的区别
pytest识别测试用例的机制 文件 以test_开头或以_test结尾的python文件,即test_xxx.py或xxx_test.py类,在第一点识别到的文件中的类,且满足一下任一条件: 1)以Test_开头,且没有__init__()初始化函数的类&a…...

民国漫画杂志《时代漫画》第17期.PDF
时代漫画17.PDF: https://url03.ctfile.com/f/1779803-1248612629-85326d?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!...

[AIGC] Spring Boot 2 自定义 Starter 指南
Spring Boot 包含一系列的 “Starter POMs”,它们都是一些方便的依赖描述符,你可以在你的应用中导入。在一些情况下,你可能想创建自己的自定义 starter。以下是创建自己的 Spring Boot Starter 的步骤。 文章目录 1. 创建基本的 Maven 项目2.…...

HCIP综合实验命令
目录 一、配置IP地址 二、配置DHCP 三、配置静态路由(内网通) 四、配置缺省路由 (外网通) 五、配置缺省 (全网通) 六、防环配置 七、配置远程登录 八、修改优先级 九、配置MP-GROUP 十、配置ppp进…...

JS移动端设置mouseover,mouseleave有效么
在移动设备的浏览器环境中,mouseover 和 mouseleave 事件的行为与桌面浏览器有所不同,主要是因为移动设备的交互方式主要是基于触摸的,而不是基于鼠标的。 在移动设备上,当用户触摸屏幕时,通常会触发 touchstart 事件…...

IAR9.30安装和注册相关
下载解压licpatcher64工具,把licpatcher64.exe拷贝到IAR的安装目录中双击运行。 示例IAR9.30.1默认安装如下如下,一共三个分别拷贝运行,不要遗漏。 C:\Program Files\IAR Systems\Embedded Workbench 9.1\arm\bin C:\Program Files\IAR Syst…...

HTTP Digest Access Authentication Schema
HTTP Digest Access Authentication Schema 背景介绍ChallengeResponse摘要计算流程总结参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。 介绍 HTTP Digest Access Authentication Schemaÿ…...

MySql超大Sql文件导入效率优化
对于MySQL中超大SQL文件的导入,效率优化是至关重要的,因为不当的操作可能导致导入过程耗时过长,甚至失败。以下是一些建议来优化MySQL超大SQL文件的导入效率: 调整max_allowed_packet参数: 这个参数定义了MySQL服务器和…...

【leetcode1944--队列中可以看到的人数】
有n人排成一个队列,从左到右编号为0到n-1,height数组记录每个人的身高,返回一个数组,记录每个人能看到几个人。 类比:山峰问题,高的后面的矮的看不见。 从后往前,最后一个元素入栈,…...

基于51单片机的室内空气质量检测-仿真设计
本设计是基于单片机的空气质量检测设计,主要实现以下功能: 可实现通过SGP30测量二氧化碳及甲醛浓度,当超过设置的最大值时,进行报警及通风和净化空气处理 可实现通过MQ-4测量甲烷浓度,当超过设置的最大值时࿰…...

day22二叉树part08 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
**235. 二叉搜索树的最近公共祖先 ** 这里利用上了二叉搜索树的特性,从上到下遍历,最近的公共祖先一定是满足p->val < root->val < q->val的 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr…...

【Linux】Linux环境基础开发工具_2
文章目录 四、Linux环境基础开发工具2. vimvim的常见模式 未完待续 四、Linux环境基础开发工具 2. vim vim 是Linux下的一款 多模式编辑器 ,可以用来写代码,是 vi 的升级版。 此时无法输入,需要切换模式。 如上图,i 就是切换成…...

长方形边框 上方中间有缺口 css
<div class"text_6">大234234师掌4234柜</div><div class"text-wrapper_1"><span class"paragraph_1">四川慧创云戈科技有限公司推出的“大师掌柜”,是一个以餐饮外卖为切入口,专注实体小店新零售…...

2024-05-29 架构-程序设计-思考
摘要: 最近在抽出时间做一个数据库的driver, 其中有些问题驱动的软件代码的思考,是很值得回味的。 做的系统,所思考的问题,所设计的解决方案,其实都是可以看作是对解决问题方式。而不仅仅是某个类库的API的使用,某个…...

关于网络的基础知识
大家好,在当今数字时代,网络已经成为我们生活中不可或缺的一部分,它连接着世界的每一个角落,让信息、资源和人们彼此之间无阻碍地交流和共享。然而,对于许多人来说,网络仍然是一个神秘而复杂的领域…...

CTF网络安全大赛简单web题目:eval
题目来源于:bugku 题目难度:简单 一道简单web的题目 题目源代码: <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 这个PHP脚本有几个关键部分,但…...

Linux通过 SSH 使用 rsync 进行文件传输
目录 目的整体思路ssh建立连接A服务器上的操作输入 ssh-keygen 生成密钥对查看公钥 B服务器上的操作设置公钥认证 A服务器上的操作使用SSH登录进行测试 同步数据知识拓展SSH(Secure Shell)rsync(Remote Sync) 目的 使用SSH&#…...

【保姆级介绍下Foxmail 邮箱】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

ABAP MD04增强排除MRP元素
场景 MD04跑出来很多MRP元素,用户想手工控制某些MRP元素不参与运算 分析 增强点还蛮好找的,控制MRP元素是否参与运算用下面的se19三代增强点就可以,打个断点看下MD04进的哪个增强点就行 旧版本的用这个:MD_CHANGE_MRP_DATA 新…...

构建一个简单的情感分析器:使用Python和spaCy
构建一个简单的情感分析器:使用Python和spaCy 引言 情感分析是自然语言处理(NLP)中的一项重要技术,它可以帮助企业和研究人员理解公众对特定主题或产品的看法。 在本篇文章中,我们将使用Python编程语言和 spaCy 库来构…...

数据库设计实例---学习数据库最重要的应用之一
一、引言【可忽略】 在学习“数据库系统概述”这门课程时,我一直很好奇,这样一门必修课,究竟教会了我什么呢? 由于下课后,,没有拓展自己的眼界,上课时又局限于课堂上老师的讲课水平,…...

数据结构算法题day05
数据结构算法题day05 题目算法思想代码运行代码 题目 从有序表中删除所有其值重复的元素,使表中所有元素的值均不同。算法思想 第一个元素(不重复)依次向后扫描,不重复就保留,重复(不保留)就删…...

关于《Java并发编程之线程池十八问》的补充内容
一、写在开头 在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。 二、Runnable vs Callable 在创建线程的时候,一般会选用 Runnable 和 Callable 两种方式。 【源码对…...

扒出秦L三个槽点,我不考虑买它了
文 | Auto芯球 作者 | 雷慢 比亚迪的有一个王炸“秦L”,再一次吸引了我注意力, 我上一辆车刚卖不久,最近打算买第二辆车, 二手车和新车都有在看, 我又是一个坚定的实用主义者, 特别是现在的经济环境不…...

【408真题】2009-28
“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…...

LeetCode---链表
203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 代码示例1:(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…...

idea 快捷键运用
ctrl d 向下复制一行 shiftalt↑/↓ 向上或者向下移动光标所在行 shiftctrl↑/↓ 向上或者向下移动光标所在行(自动对齐) shift F6 rename包名或者类名或者批量修改变量名(不建议更改项目名,包名也尽量别改) 输入if 然后ctrlshift回车 补全缺失的括号 shift …...