[代码随想录打卡Day6] 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 349. 两个数组的交集 1. 两数之和

之后补充Python的

哈希表理论基础

首先什么是哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。

哈希表是根据关键码的值而直接进行访问的数据结构。

牺牲空间换取了时间.
哈希法用到的数据结构:数组,set(集合),map

242.有效的字母异位词

题意:判断两个字符串是否由相同字母组成
哈希值小,范围小,范围可控就可以使用数组这个数据结构.
数值很大的时候使用set
key对应有value就是用map

为什么使用哈希法:遍历一个字符串中的字母,判断是否再另一个字符串中出现.(给你一个元素判断集合中是否出现就用Hash)
用什么数据结构:题中说明了都是小写a-z,26个字母,范围小使用数组.
关键码的值:某个字符串中的所有元素

class Solution {public boolean isAnagram(String s, String t) {//下面是抄的题解int[] record = new int[26];for(int i = 0; i < s.length(); i++){record[s.charAt(i)-'a']++;}for(int i = 0; i < t.length(); i++){record[t.charAt(i)-'a']--;}for(int count: record){if(count != 0 ){return false;}}return true;下面是我根据视频讲解写的// int[] hash = new int[26];//先定义hash数组// if(s.length() != t.length()){//     return false;// }else{//     for(int i= 0; i< s.length(); i++){//         hash[s.charAt(i)-'a'] ++;//     }//     for(int i = 0; i < t.length(); i++){//         hash[t.charAt(i)-'a']--;//     }//     for(int i = 0; i<26; i++){//         if(hash[i]!=0){//             return false;//         }//     }// }// return true;}
}

349. 两个数组的交集

题意:给定两个数组,编写一个函数来计算它们的交集。
为什么使用哈希法:也就是遍历其中某个数组,查看其中的元素是否在另一个数组中出现过,就使用哈希法.
使用什么数据结构:如果没有表明数字范围,数字可以很大,就使用set.如果表明数字范围,数字范围这个是可控的,小的,使用数组更有效.
关键码的值:某个数组中的所有元素

/**
好好思考一下JAVA怎么使用hash set*/
class Solution {public int[] intersection(int[] nums1, int[] nums2) {//这个是Hash set的if(nums1==null || nums1.length==0||nums2==null||nums2.length==0){return new int[0];//其中任意一个为空,说明没有交集}Set<Integer> set1 = new HashSet<>();//这个就是建立Hash set,整体我感觉还是好理解的就是把其中一个数组Hash映射得到Hash Set,然后再遍历另一个数组查找判断得到的Hash set中是否存在这个数Set<Integer> resSet = new HashSet<>();//这个就是结果数组//遍历数组1,应该是往hash表中存数,我感觉是先经过了一次Hash映射for(int i : nums1){set1.add(i);//}//遍历数组2的过程中判断哈希表中是否存在该元素for (int i : nums2){if(set1.contains(i)){resSet.add(i);//存在就往结果set中添加元素}}//方法1将结果集合转换成数组return resSet.stream().mapToInt(x -> x).toArray();//转换成数组// //方法2:另外申请一个数组存放setRes中的元素,最后返回数组 // int[] arr = new int[resSet.size()];//初始化一个数组// int j = 0;// for( int i : resSet){//     arr[j++] = i;// }// return arr;}}
/**
好好思考一下JAVA怎么使用hash set*/
class Solution {public int[] intersection(int[] nums1, int[] nums2) {//再看一下用数组的形式的int[] hash1 = new int[1002];int[] hash2 = new int[1002];for(int i : nums1)hash1[i]++;//只要这个数存在就可以for(int i : nums2)hash2[i]++;List<Integer> resList = new ArrayList<>();for(int i = 0; i< 1002; i++)if(hash1[i]>0 && hash2[i]>0)resList.add(i);int index = 0;int res[] = new int[resList.size()];for(int i : resList)res[index++] = i;return res;}}

202. 快乐数

为什么使用哈希法:注意无限循环,说明如果其中sum重复出现就陷入无限循环.我们保存sum(每个数位的平方的和),然后判断sum是否重复出现,也就是当前的sum是否在过去sum的集合中出现过,就使用哈希法.
使用什么数据结构:这个题的数字没有限制范围,使用set
关键码的值:sum(当前数所有数位的数字的平方的和)

class Solution {public boolean isHappy(int n) {//试试JAVASet<Integer> record = new HashSet<>();//这个就是存储平方和的while(n!=1 && !record.contains(n)){//不是1就继续循环,然后如果record中没有就说明还没有陷入到死循环record.add(n);//往hash表中添加这个和n = getNeXtNumber(n);//就是变成单数的平方和}return n==1;}private int getNeXtNumber(int n){//这个很简单就是计算每个数位的数的平方和int res = 0;while(n > 0){int temp = n % 10;res += temp * temp;n = n/ 10;//移动到下一个数位}return res;}
}

1. 两数之和

为什么使用哈希法:因为它是遍历数组中的值,查找当前值对应的满足条件的另一个值是否在之前遍历过的值的集合中.
为什么使用map:因为这个题目是要返回下标,除了找到符合条件的元素还需要下标,两个值所以使用map
map的作用:存储遍历过的元素
map中的key分别存放什么:key存放元素值,value存放下标

class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];//存放两个下标if(nums==null || nums.length==0){return res;}Map<Integer, Integer> map = new HashMap<>();//这个存放遍历过的元素for(int i = 0; i < nums.length; i++){int temp = target - nums[i];   // 遍历当前元素,并在map中寻找是否有匹配的keyif(map.containsKey(temp)){res[1] = i;res[0] = map.get(temp);break;}map.put(nums[i], i);    // 如果没找到匹配对,就把访问过的元素和下标加入到map中}return res;}
}

参考的题目、文章、视频

  1. https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0
  2. https://leetcode.cn/problems/valid-anagram/description/
  3. https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
  4. https://www.bilibili.com/video/BV1YG411p7BA/
  5. https://leetcode.cn/problems/intersection-of-two-arrays/description/
  6. https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html
  7. https://www.bilibili.com/video/BV1ba411S7wu/
  8. https://leetcode.cn/problems/happy-number/description/
  9. https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html
  10. https://leetcode.cn/problems/two-sum/
  11. https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
  12. https://www.bilibili.com/video/BV1aT41177mK/

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

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

相关文章

WPF+MVVM案例实战(二十三)- 阴影效果详解

文章目录 1、案例效果2、阴影属性参数说明3、阴影效果实现1、案例效果 2、阴影属性参数说明 WPF 中,控件的阴影效果是通过附加属性 Effect 来实现的。这里详细说明以下阴影效果的各个参数。 属性描述BlurRadius阴影模糊程度,值越大越模糊Color阴影颜色Opacity阴影透明度,默…

学习笔记:黑马程序员JavaWeb开发教程(2024.11.4)

5.8 请求响应-请求-案例 数据保存在emp.xml文件中&#xff0c;解析XML的工具类XMLParserUtils&#xff0c;其中使用了dom4j的接口&#xff0c;因此要在pom.xml文件中引入dom4j的依赖&#xff0c;用于解析XML文件&#xff0c;实体类Emp用于封装服务器解析的数据 前端页面文件…

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具&#xff0c;用于统一管理我们项目中各种数据的交互和重用&#xff0c;存储我们需要用到的数据对象属性 state&#xff1a;vuex的基本…

HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别

在为您的应用程序选择通信协议时&#xff0c;有很多不同的选择。 本文将了解四种流行的解决方案&#xff1a;HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进&#xff1a;变得更快、更方便、更可靠&…

Spring Boot 中实现多数据源连接和切换的方案

在现代企业级应用开发中,常常会遇到需要连接多个数据源的情况。例如,一个应用可能需要同时访问不同的数据库以获取不同类型的数据,或者在不同的环境下切换数据源以满足特定的需求。Spring Boot 作为一个流行的 Java 开发框架,提供了多种方式来实现多数据源连接和切换。 一、…

24.11.3

星期一&#xff1a; 补24武汉高校联合程序设计新生赛 C cf传送门 最开始用倍增树链刨分&#xff0c;稳定T 思路&#xff1a;处理出树链刨分的dfn序和重链等前置信息&#xff0c;然后对每条重链开个set&#xff08;常见方法&#xff0c;用于存断开的边&…

嵌入式开发之文件I/O-函数

Read函数 read函数用来从文件中读取数据: #include <unistd.h> ssize_t read(int fd,void *buf,size_t count); fd:文件描述符buf:缓冲区的首地址,接收从文件中读取的内容count:指定读取字节数,不能超过buf的大小。习惯指定成缓冲区大小成功时返回实际读取的字节数…

Nop入门:极简数据访问层实现

Nop平台的数据访问层使用NopORM引擎&#xff0c;它的功能相当于JPA MyBatis SpringData&#xff0c;并且内置了多租户、逻辑删除、动态扩展字段、字段加密等业务常用功能。 NopGraphQL服务框架会自动自动识别ORM的实体对象&#xff0c;自动使用ORM引擎去实现实体关联属性的批…

大端存储和小端存储

大端存储和小端存储 在计算机系统中&#xff0c;数据在内存中的存储方式并不是唯一的。对于多字节的数据类型&#xff08;如 int、float 等&#xff09;&#xff0c;计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种&#xff1a;大端存储&#xff08;Big-En…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者&#xff0c;以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

C#-类:成员变量

声明在类语句块中&#xff0c;描述对象的特征&#xff0c;可为任意变量类型 可包含&#xff1a;枚举、结构体、类、其他 1. 类成员的详细定义 特征->成员变量&#xff1a;包括类的数据&#xff1a;变量、常量、事件的成员行为->成员方法&#xff1a;普通方法、属性、构…

PAT甲级-1133 Splitting A Linked List

题目 题目大意 给定一个链表的首节点地址和节点个数&#xff0c;以及一个数k。要求重新排列该链表&#xff0c;使其按<0 &#xff0c;> 0 && < k&#xff0c;>k 的顺序排序。但是不改变原有顺序&#xff0c;比如-4 -> -6 -> -2&#xff0c;不需要再…

【spark的集群模式搭建】spark集群之Yarn集群模式搭建(清晰明了的搭建流程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接&#xff08;如果在Standalone模式中创建有就删除&#xff09;4、配置spark环境变量5、修改spark-env.sh配置文件6、修改spark-defaults.conf 配置文件7、修改log4j.properties配置文件8、上传spark jar包…

Android IPC机制(三)进程间通信方式

在Android中有以下几种进程间通信方式: 目录 1.Bundle 2.文件共享 3.Messenger 4.ContentProvider 5.AIDL 1.Bundle Bundle是Android中用于存储一组键值对的类&#xff0c;它实现了Parcelable接口。这使得Bundle能够在不同的进程之间传递数据。当我们通过Intent启动其他应…

ubuntu系统安装升级jdk到17

百度安全验证 https://blog.csdn.net/qq_44866828/article/details/130557027 然后修改一下配置路径 试下java --version命令

GEE数据集:全球天然林和人工林数据集提供了一张高分辨率(30 米)地图,用于区分截至 2021 年全球的天然林和人工林

目录 简介 全球天然林和人工林 数据生成和分类 代码 引用 License 网址推荐 知识星球 机器学习 GEE数据集&#xff1a;全球天然林和人工林数据集提供了一张高分辨率&#xff08;30 米&#xff09;地图&#xff0c;用于区分截至 2021 年全球的天然林和人工林 简介 全球…

20241031 Apache2修改日志里面的时间格式

问题背景,Apache2里面日志输出,关于时间这一块,看着难受,所以有了如下需求,修改日志里面的时间格式 案例日志 127.0.0.1 - - [31/Oct/2024:19:20:34 0800] "GET /index.php/vod/search/actor/XimenadelSolar.html HTTP/1.1" 200 4233 "-" "Mozilla/5…

基于SpringBoot司机信用评价的货运管理系统【附源码】

基于SpringBoot司机信用评价的货运管理系统 效果如下&#xff1a; 系统主页面 系统注册页面 司机注册页面 管理员主页面 订单评价页面 货物信息页面 个人信息页面 研究背景 随着我国物流行业的迅猛发展&#xff0c;货运管理系统的效率与安全性日益受到重视。在货运过程中&am…

11.4OpenCV_图像预处理习题02

1.身份证号码识别&#xff08;结果&#xff1a;身份证号识别结果为&#xff1a;911124198108030024&#xff09; import cv2 import numpy as np import paddlehub as hubdef get_text():img cv2.imread("images1/images/shenfen03.jpg")# 灰度化gray_img cv2.cvt…

推荐:自然语言处理方向的一些创新点

以下是自然语言处理研究方向的一些创新点&#xff1a; 一、预训练模型的改进与优化 模型架构创新 融合多模态信息&#xff1a; 传统的自然语言处理模型主要处理文本信息。创新点在于将图像、音频等多模态信息融合到预训练模型中。例如&#xff0c;对于描述一幅画的文本&#x…