代码随想录二刷 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&#…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...