数据结构-哈西表笔记

自定义26位字母哈西表

有效的字母异位词

242. 有效的字母异位词 - 力扣(LeetCode)

class Solution {public boolean isAnagram(String s, String t) {// 获取字符串 s 和 t 的长度int sLen = s.length();int tLen = t.length();// 如果两个字符串的长度不相等,则它们不可能是字母异位词if (sLen != tLen) {return false;}// 创建一个大小为 26 的数组 count 来统计每个字母出现的次数// 数组的索引 0-25 对应字母 'a'-'z'int count[] = new int[26];// 遍历字符串 s,并更新 count 数组// 对于 s 中的每个字符,计算其相对于 'a' 的索引位置,并将该位置的计数器加 1for (int i = 0; i < sLen; i++) {count[s.charAt(i) - 'a']++;}// 遍历字符串 t,检查每个字符在 count 数组中的计数for (int i = 0; i < tLen; i++) {// 如果 t 中的某个字符的计数已经为 0 或小于 0,说明它在 s 中不存在// 或者 s 中该字符出现的次数不足,直接返回 falseif (count[t.charAt(i) - 'a'] <= 0) {return false;}// 对于 t 中的每个字符,计算其索引位置,并将该位置的计数器减 1count[t.charAt(i) - 'a']--;}// 如果所有字符的出现次数都能相互抵消,说明 s 和 t 是字母异位词return true;}
}

赎金信

383. 赎金信 - 力扣(LeetCode)

class Solution {public boolean canConstruct(String ransomNote, String magazine) {// 不需要检查长度是否相等,题目并未要求int[] map = new int[26]; // 长度为26的数组,用于记录字符次数// 遍历 `magazine`,将每个字符出现的次数记录到 `map` 中。for(int i = 0; i < magazine.length(); i++){map[magazine.charAt(i) - 'a']++;  // 累加 magazine 中字符的出现次数}// 遍历 `ransomNote`,减少对应字符的计数。for(int i = 0; i < ransomNote.length(); i++){map[ransomNote.charAt(i) - 'a']--; // 减少 ransomNote 中字符的计数// 如果某个字符在 `magazine` 中的数量不足以构造 `ransomNote`,返回 falseif(map[ransomNote.charAt(i) - 'a'] < 0){return false;}}return true; // 能够成功构造则返回 true}
}

java自带hashset

两个数组的交集

349. 两个数组的交集 - 力扣(LeetCode)

class Solution {public int[] intersection(int[] nums1, int[] nums2) {// 创建一个 HashSet 存储 nums1 中的所有元素,避免重复Set<Integer> hashset1 = new HashSet<>();// 创建另一个 HashSet 存储 nums2 中与 nums1 交集的元素Set<Integer> hashset2 = new HashSet<>();// 遍历 nums1 数组,并将其所有元素添加到 hashset1 中for (int i = 0; i < nums1.length; i++) {hashset1.add(nums1[i]);  // HashSet 自动去重}// 遍历 nums2 数组,检查 hashset1 是否包含 nums2 中的元素// 如果包含,则该元素为交集,将其添加到 hashset2 中for (int i = 0; i < nums2.length; i++) {if (hashset1.contains(nums2[i])) {hashset2.add(nums2[i]);  // 只添加交集部分的元素}}// 将 hashset2 中的元素转换为数组形式,返回交集结果int ret[] = new int[hashset2.size()];  // 初始化结果数组,大小为交集元素的个数int i = 0;for (int temp : hashset2) {ret[i] = temp;  // 将 HashSet 中的元素逐一存入数组i++;}return ret;  // 返回最终的交集数组}
}

快乐数

202. 快乐数 - 力扣(LeetCode)

class Solution {public boolean isHappy(int n) {// 创建一个 HashSet 来记录已经计算过的数字,防止进入无限循环Set<Integer> hashset = new HashSet<>();// 循环条件:n 不等于 1 且 n 不在 hashset 中时继续循环while (n != 1 && !hashset.contains(n)) {// 将当前数字 n 加入 hashset,表示已经访问过hashset.add(n);// 计算 n 的各位数字的平方和,更新 nn = isHappySum(n);}// 如果最终 n 等于 1,则返回 true,表示该数字是快乐数;否则返回 falsereturn n == 1;}// 计算数字 n 的各位数字平方和的函数int isHappySum(int n) {int sum = 0;// 当 n > 0 时,不断取出各位数字并计算它们的平方while (n > 0) {int temp = n % 10;  // 取出 n 的最后一位数字sum += temp * temp;  // 计算该位数字的平方并累加到 sumn /= 10;  // 去掉最后一位数字}// 返回各位数字平方和return sum;}
}

哈希表HashMap

两数之和

1. 两数之和 - 力扣(LeetCode)

import java.util.HashMap;class Solution {public int[] twoSum(int[] nums, int target) {// 创建一个长度为2的数组,用于存放结果int ret[] = new int[2];// 创建一个哈希表,用于存储数组元素及其对应的索引HashMap<Integer, Integer> map = new HashMap<>();// 遍历输入数组,将每个元素及其索引存入哈希表for (int i = 0; i < nums.length; i++) {map.put(nums[i], i);}// 再次遍历输入数组,寻找两个数的和等于目标值for (int i = 0; i < nums.length; i++) {// 计算当前元素所需的另一半int temp = target - nums[i];// 检查哈希表中是否存在另一半,且它的索引不是当前元素的索引if (map.containsKey(temp) && map.get(temp) != i) {// 找到满足条件的两个元素,存入结果数组ret[0] = i;               // 当前元素的索引ret[1] = map.get(temp);  // 另一半的索引break;                   // 找到结果后跳出循环}}return ret; // 返回结果数组}
}

四数相加II

454. 四数相加 II - 力扣(LeetCode)

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {// 创建一个 HashMap 用于存储 nums1 和 nums2 的所有可能和及其出现的次数HashMap<Integer, Integer> map = new HashMap<>();int ret = 0; // 用于存储符合条件的四元组数量// 遍历 nums1 和 nums2 以计算所有可能的和for (int i = 0; i < nums1.length; i++) {for (int j = 0; j < nums2.length; j++) {// 计算 nums1[i] 和 nums2[j] 的和int temp = nums1[i] + nums2[j];// 如果 map 中已经存在该和,则将其计数加一if (map.containsKey(temp)) {map.put(temp, map.get(temp) + 1);} else {// 否则,将该和加入 map,并初始化计数为 1map.put(temp, 1);}}}// 遍历 nums3 和 nums4 以查找与 map 中的和匹配的元素for (int i = 0; i < nums3.length; i++) {for (int j = 0; j < nums4.length; j++) {// 计算 - (nums3[i] + nums4[j]),以便与 map 中的和进行匹配int temp = -nums3[i] - nums4[j];// 如果 map 中存在这个和,则将该和对应的计数加到 ret 中if (map.containsKey(temp)) {ret += map.get(temp);}}}// 返回符合条件的四元组的总数return ret;}
}

双指针

三数之和(难)

难在去重。如果不用去重就可以用哈希表

15. 三数之和 - 力扣(LeetCode)

class Solution {public List<List<Integer>> threeSum(int[] nums) {// 初始化结果列表,用来存储所有符合条件的三元组List<List<Integer>> ret = new ArrayList<>();// 首先对输入数组进行排序,这样我们可以利用排序后的性质来避免重复和进行双指针操作Arrays.sort(nums);// 遍历排序后的数组,i 是第一个选定的数,遍历数组中所有可能的第一个数for (int i = 0; i < nums.length; i++) {// 如果当前数大于0,则没有必要继续查找,因为在排序数组中,后续的数也都大于0,三数之和不可能为0if (nums[i] > 0) {break;}// 跳过重复的数值,避免结果中出现重复的三元组if (i > 0 && nums[i] == nums[i - 1]) {continue;}// 设置双指针,left 指向当前数之后的元素,right 指向数组末尾int left = i + 1;int right = nums.length - 1;// 使用双指针方法寻找三个数的和为0的组合while (left < right) {// 计算当前三个数的和int sum = nums[i] + nums[left] + nums[right];// 如果和大于0,说明右指针处的数太大,需要左移右指针if (sum > 0) {right--;// 如果和小于0,说明左指针处的数太小,需要右移左指针} else if (sum < 0) {left++;// 如果和等于0,找到了一个符合条件的三元组} else {// 将找到的三元组加入结果列表ret.add(Arrays.asList(nums[i], nums[left], nums[right]));// 为了避免重复的三元组,继续移动左指针,跳过所有重复的左边元素while (left < right && nums[left] == nums[left + 1]) {left++;}// 同样,继续移动右指针,跳过所有重复的右边元素while (left < right && nums[right] == nums[right - 1]) {right--;}// 在找到一个三元组后,继续尝试其他可能性,因此移动双指针left++;right--;}}}// 返回所有找到的不重复的三元组return ret;}
}

四数之和(难)

. - 力扣(LeetCode)

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {// 这个列表将存储最终的四元组结果List<List<Integer>> ret = new ArrayList<>();// 排序输入数组,以便于避免重复并使用双指针技术Arrays.sort(nums);// 遍历数组,选择四元组中的第一个数字for (int i = 0; i < nums.length; i++) {// 如果当前数字大于目标值且非负,可以提前结束if (nums[i] > target && nums[i] >= 0) {break;}// 跳过第一个数字的重复项if (i > 0 && nums[i] == nums[i - 1]) {continue;}// 遍历选择第二个数字for (int j = i + 1; j < nums.length; j++) {// 检查前两个数字的和是否已经超过目标值if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) {break;}// 跳过第二个数字的重复项if (j > i + 1 && nums[j] == nums[j - 1]) {continue;}// 设置两个指针以查找剩下的两个数字int left = j + 1;int right = nums.length - 1;// 使用双指针查找剩下的两个数字while (left < right) {// 计算四个数字的和int sum = nums[i] + nums[j] + nums[left] + nums[right];// 如果和小于目标值,移动左指针向右if (sum < target) {left++;}// 如果和大于目标值,移动右指针向左else if (sum > target) {right--;}// 如果和等于目标值,找到一个四元组else {// 将四元组添加到结果列表ret.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));// 跳过第三个数字的重复项while (left < right && nums[left] == nums[left + 1]) {left++;}// 跳过第四个数字的重复项while (left < right && nums[right] == nums[right - 1]) {right--;}// 找到有效的四元组后,移动两个指针left++;right--;}}}}// 返回唯一四元组的列表return ret;}
}

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

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

相关文章

[ESP32]ESP-IDF使用组件添加U8g2图形库

U8g2 在ESP32使用u8g2的时候可以使用添加component的方式进行, 由于官方的component库没有, 这里我找到了一个可以使用的github库, 使用git的方式进行添加这一个库 具体的原理可以看[官方手册](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/to…

使用seata管理分布式事务

做应用开发时&#xff0c;要保证数据的一致性我们要对方法添加事务管理&#xff0c;最简单的处理方案是在方法上添加 Transactional 注解或者通过编程方式管理事务。但这种方案只适用于单数据源的关系型数据库&#xff0c;如果项目配置了多个数据源或者多个微服务的rpc调用&…

C语言 | Leetcode C语言题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; bool kmp(char* query, char* pattern) {int n strlen(query);int m strlen(pattern);int fail[m];memset(fail, -1, sizeof(fail));for (int i 1; i < m; i) {int j fail[i - 1];while (j ! -1 && pattern[j 1] ! pattern…

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

在Linux系统安装Nginx

注意&#xff1a;Nginx端口号是80(云服务器要放行) 我的是基于yum源安装 安装yum源(下面这4步就好了) YUM源 1、将源文件备份 cd /etc/yum.repos.d/ && mkdir backup && mv *repo backup/ 2、下载阿里源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo ht…

LabVIEW机床加工监控系统

随着制造业的快速发展&#xff0c;机床加工的效率与稳定性成为企业核心竞争力的关键。传统的机床监控方式存在效率低、无法远程监控的问题。为了解决这些问题&#xff0c;开发了一种基于LabVIEW的机床加工监控系统&#xff0c;通过实时监控机床状态&#xff0c;改进生产流程&am…

安卓 /proc 目录详解:从内核到进程的桥梁

在安卓系统中&#xff0c;/proc 目录是开发者、调试者、甚至是普通用户深入了解系统状态、性能及行为的一个重要入口。这个虚拟文件系统不仅包含了丰富的内核信息&#xff0c;还反映了运行中的每个进程的状态。 /proc 文件系统 /proc 文件系统&#xff08;procfs&#xff09;是…

振动分析-30-振动信号的幅值概率密度函数CWRU西楚大学轴承数据(实战)

文章目录 1 背景2 幅值概率密度函数3 实现流程3.1 自定义函数3.2 模拟正弦信号4 CWRU轴承数据4.1 加载数据4.2 相同工况不同故障4.3 相同数据不同份数5 参考附录1 背景 很多初学者刚接触故障诊断可能觉得很简单,套用深度学习模型进行训练,分类准确率达到99%即可。 在写论文时…

AL生成文章标题指定路径保存:创新工具助力内容创作高效启航

在信息爆炸的时代&#xff0c;一个吸引人的标题是文章成功的第一步。它不仅要准确概括文章内容&#xff0c;还要能激发读者的好奇心&#xff0c;促使他们点击阅读。随着人工智能技术的飞速发展&#xff0c;AL生成文章标题功能正逐渐成为内容创作者的新宠&#xff0c;看看它是如…

Python基本库的使用--urllib

开篇 本篇文章旨在总结urlib基本库的一些常用用法。 相关方法 urlopen 用户打开和读取URL。 import urllib.requestresponse urllib.request.urlopen(https://www.python.org) print(response.read().decode(utf-8))带data参数 import urllib.parse import urllib.requestda…

队列的实现与讲解

一.概念与结构 1.概念 只允许在⼀端进行插⼊数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) ​ 入队列&#xff1a;进⾏插⼊操作的⼀端称为队尾 ​ 出队列&#xff1a;进⾏删除操作的⼀端称为队头 注意&…

WebRTC Connection Negotiate解决

最近有个项目 &#xff0c;部署之后一直显示&#xff0c;查了一些资料还是没有解决&#xff0c;无奈只有自己研究解决&#xff1f; 什么是内网穿透&#xff1f; 我们访问我们自己的官网产品页面&#xff0c;我们的服务器是一个单独的个体&#xff0c;有独立的公网ip&#xf…

2024年10月6日历史上的今天大事件早读

23年10月06日西汉“新莽政权”领袖王莽被刺身亡 1866年10月06日清政府批准筹设天津机器局 1905年10月06日俄国爆发铁路工人大罢工 1913年10月06日中、英西姆拉会商“西藏问题” 1927年10月06日阿尔-乔尔森主演第一部有声电影 1940年10月06日新四军获黄桥决战胜利 1949年1…

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

文章目录 一、迁移学习的简单介绍1.迁移学习是什么&#xff1f;2.迁移学习的步骤 二、数据集介绍三、代码实现1. 步骤2.所用到方法介绍的文章链接3. 完整代码 一、迁移学习的简单介绍 1.迁移学习是什么&#xff1f; 迁移学习是指利用已经训练好的模型&#xff0c;在新的任务上…

Windows应急响应-Auto病毒

文章目录 应急背景分析样本开启监控感染病毒查看监控分析病毒行为1.autorun.inf分析2.异常连接3.进程排查4.启动项排查 查杀1.先删掉autorun.inf文件2.使用xuetr杀掉进程3.启动项删除重启排查入侵排查正常流程 应急背景 运维人员准备通过windows共享文档方式为公司员工下发软件…

保险丝基础知识

一、简介 保险丝&#xff08;fuse&#xff09;也被称为电流保险丝&#xff0c;它能够在电流异常升高到一定的高度和热度时&#xff0c;自动熔断切断电流&#xff0c;从而保护电路安全运行。 IEC127标准将它定义为“熔断体&#xff08;fuse-link)”。熔断体是由电阻率比较大而熔…

强化学习笔记之【Q-learning算法和DQN算法】

强化学习笔记&#xff08;一&#xff09;——Q-learning和DQN算法核心公式 文章目录 强化学习笔记&#xff08;一&#xff09;——Q-learning和DQN算法核心公式前言&#xff1a;Q-learning算法DQN算法 前言&#xff1a; 强化学习领域&#xff0c;繁冗复杂的大段代码里面&#…

《软件工程概论》作业一:新冠疫情下软件产品设计

课程说明&#xff1a;《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论&#xff08;第6版&#xff09;》&#xff08;张海藩等编著&#xff0c;清华大学出版社&#xff09;作为教材。以《软件设计文档国家标准GBT8567-2006》…

【小沐学GIS】blender导入OpenTopography地形数据(BlenderGIS、OSM、Python)

文章目录 1、简介1.1 blender1.2 OpenStreetMap地图 2、BlenderGIS2.1 下载BlenderGIS2.2 安装BlenderGIS2.3 申请opentopography的key2.4 抓取卫星地图2.5 生成高度图2.6 获取OSM数据 结语 1、简介 1.1 blender https://www.blender.org/ Blender 是一款免费的开源 3D 创作套…

IMS添加实体按键流程 - Android14

IMS添加实体按键流程 - Android14 1、实体按键信息&#xff08;Mi 9 左侧实体按键&#xff09;2、硬件添加2.1 内核添加设备节点2.2 Generic.kl映射文件2.3 映射文件文件加载loadKeyMapLocked2.4 addDeviceLocked 添加设备相关对象 3、keycode对应scankode4、KeyEvent.java 添加…