代码随想录二刷 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&#…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...