代码随想录刷题笔记(DAY 6)

今日总结:今天是关于哈希表的题目,总体难度不算太大,今天准备再写一篇关于 Vuex 的博客。

Day 6

01. 有效的字母异位词(No. 242)

题目链接

代码随想录题解

1.1 题目

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

**注意:**若 st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true

示例 2:

输入: s = “rat”, t = “car”
输出: false

1.2 笔记

哈希表(Hash Table)是一种数据结构,用于实现字典(Dictionary)和映射(Map)等抽象数据类型。它通过哈希函数将键(key)映射到哈希表中的特定位置,以便快速定位和检索值(value)。哈希表的主要思想是将键转换为索引,使得在理想情况下可以在常量时间内(O(1) 的时间复杂度)查找或插入元素。

哈希表的核心组成部分包括:

  1. 哈希函数(Hash Function): 这是哈希表的关键部分,它将键转换为哈希码或哈希值。理想的哈希函数应该将不同的键映射到不同的哈希值,尽可能避免冲突(多个键映射到同一个位置)。
  2. 哈希表或哈希桶(Hash Table / Hash Bucket): 这是存储实际数据的地方。哈希表由一个数组构成,每个位置通常被称为“桶”,存储着键值对或者指向键值对的指针。
  3. 解决冲突的方法: 当不同的键经过哈希函数映射到相同的位置时,就会发生冲突。解决冲突的方法有很多种,常见的包括开放定址法(如线性探测和二次探测)和链表法(或者更高效的形式,如使用红黑树)。

哈希表一般用于快速的判断一个元素是否出现在集合里。

对于上面的题目暴力解法就是两层 for 循环,记录字符是否重复出现,时间复杂度为 O(n^2)

这道题可以通过哈希表的方式解题,因为上面提到,哈希表可以快速的判断一个元素是否出现在集合里,所以如果两个字符串的长度相同,且各个字母的出现次数也相同就说明他们两个互为字母异位词。

我们知道,小写字母的 ASCII 码值是相邻的,一个长度为 26 的数组就可以存储这些字母出现的频率,将数组的下标作为索引,将数组元素值作为值就可以快速的查找。

首先判断两个字符串的长度是否相同,如果不同直接返回 false 之后同时循环遍历两个数组,如果字符串 1 中出现了就将索引加一,字符串 2 中出现则减一,最后我们去检查这个数组,如果出现了非 0 的值,说明这两个字符串不是互为异位词。

1.3 代码
class Solution {public boolean isAnagram(String s, String t) {// 将字符串转化为字符数组char[] charArray1 = s.toCharArray();char[] charArray2 = t.toCharArray();int length = charArray1.length;// 检测长度if (charArray2.length != length) {return false;}int[] hash = new int[26]; // 哈希数组for (int i = 0; i < length; i++) {hash[charArray1[i] - 'a']++;hash[charArray2[i] - 'a']--;}for (int i = 0; i < hash.length; i++) {if (hash[i] != 0) {return false;}}return true;}
}

02. 两个数组的交集(No. 349)

题目链接

代码随想录题解

2.1 题目

349. 两个数组的交集

给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000
2.2 笔记

也是一道非常简单的问题,和上面题目的思想相同,我们先来看数组的解法,之后再通过集合去简化。

题目中已经限定了数组中元素的大小,所以我们直接将哈希数组声明为长度为 1000 的数组即可,这道题易错点是是否考虑了去重,所以我们遍历第一个数组,将出现的数字作为索引,值我们统一设为 1,再去遍历第二个数组,这时候就要注意了,我们必须保证结果集中只添加了一次,所以给出如下的判断语句:

if (hash[nums2[i]] == 1 && ++hash[nums2[i]] == 2) {list.add(nums2[i]);
}

只能是 2 的时候再接收,如果后续为 3 或者其他数字说明我们加重了。

2.3 代码
class Solution {int[] hash = new int[1000]; // 哈希数组public int[] intersection(int[] nums1, int[] nums2) {List<Integer> list = new ArrayList<>(); // 结果列表for (int i = 0; i < nums1.length; i++) {hash[nums1[i]] = 1;}for (int i = 0; i < nums2.length; i++) {// 保证不会重复if (hash[nums2[i]] == 1 && ++hash[nums2[i]] == 2) {list.add(nums2[i]);}}// 将结果转化为数组int index = 0;int res[] = new int[list.size()];for(int i : list)res[index++] = i;return res;        }
}
2.4 拓展 —— 利用 Set 解题
import java.util.HashSet;
import java.util.Set;class Solution {public int[] intersection(int[] nums1, int[] nums2) {if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {return new int[0];}Set<Integer> set1 = new HashSet<>();Set<Integer> resSet = new HashSet<>();//遍历数组1for (int i : nums1) {set1.add(i);}//遍历数组2的过程中判断哈希表中是否存在该元素for (int i : nums2) {if (set1.contains(i)) {resSet.add(i);}}//方法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;}
}

和上面数组的解法时间是略高于前面的方法的,因为题目中限制了数字的大小,但如果很大的话,集合解法是优于数组的。

03. 快乐数(No. 202)

题目链接

代码随想录题解

3.1 题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

3.2 笔记

也是一道比较简单的题目,唯一的难点可能就是如何求各位置上的平方和

我们来分析一下这道题目,一个数字只有两种情况:1. 经过有限次的平方加和变为了 1 2. 陷入循环,那我们如何判断是否陷入了循环呢?

就看一个和是否出现过,如果出现过两次则说明一定陷入了循环。

理解了这些,代码就非常好写了

3.3 代码
class Solution {public boolean isHappy(int n) {Set<Integer> record = new HashSet<>();int x = 0; // 每一位上的数字int sum = 0; // 每一次循环的和// 检测是否重复或者为 1while (sum != 1 && !record.contains(n)) {x = 0;sum = 0;record.add(n); // 放入集合中while (n > 0) {x = n % 10; sum += x * x; n = n / 10;               }n = sum;}return sum == 1;}
}

04. 两数相加(No. 01)

题目链接

代码随想录题解

4.1 题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

4.2 笔记

又是这道经典的梦开始的地方,这里我们来介绍这道题的哈希解法.

回顾一下,什么时候用哈希表?就是我们判断一个数在之前有没有出现过,在这道题里面,我们要判断的就是target - nums[i] 在我们之前的遍历中是否出现过,如果出现过就表明我们找到了这个组合,将这两个下标直接返回即可

我们可以通过 Map 来同时存储数字的下标和数值,也可以直接从头开始遍历求解.

4.3 代码
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;}
}

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

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

相关文章

疯狂程序员之重头暴学英语语法宝典!!!

学习英语语法真的很重要&#xff01;虽然也许不会与外国人交流&#xff0c;但是你可能会因为编程学习或者阅读英语资料苦恼&#xff0c;既然看到了不如就从现在开始好好学英语吧&#xff01;Nothing is impossible to a willing heart&#xff08;有志者事竟成&#xff09;! 第…

【二叉树】【BFS】【DFS】111. 二叉树的最小深度

题目 法1&#xff1a;BFS class Solution {public int minDepth(TreeNode root) {if (root null) {return 0;}int depth 1;Queue<TreeNode> queue new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int curSize queue.size();for (int i 0;…

作业--day39

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

编程语言未来发展趋势探析:简化与标准化、并发与分布式、智能应用新篇章

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

PyTorch 节省显存技巧:Activation Checkpointing

参考资料 官方文档&#xff1a; https://pytorch.org/docs/2.0/checkpoint.html官方博客&#xff1a;https://medium.com/pytorch/how-activation-checkpointing-enables-scaling-up-training-deep-learning-models-7a93ae01ff2d Activation Checkpointing 介绍 激活检查点 …

【致远OA】按人员编码获取所有待办事项

接口说明 按人员编码获取所有待办事项 兼容版本 since V7.0 请求方式 http请求方式&#xff1a;GET http://ip:port/seeyon/rest/affairs/pending/code/{memberCode} 如 http://127.0.0.1/seeyon/rest/affairs/pending/code/9981 效果参考 响应结果 参考对象实例&#x…

P9198 题解

温馨提示: \color{#E74C3C}\text{温馨提示:} 温馨提示: 遇见题解勿抄袭&#xff0c;棕名封号两行泪。 \color{#E74C3C}\text{遇见题解勿抄袭&#xff0c;棕名封号两行泪。} 遇见题解勿抄袭&#xff0c;棕名封号两行泪。 题目传送门 这道题目呢&#xff0c;非常得良心&#xff…

事件循环的理解

1.单线程 Js是一个单线程的语言,代码只能一行一行去执行,遇到同步的代码就直接执行了,如果遇到异步的代码怎么办&#xff1f; 不可能等到异步的代码执行完&#xff0c;在去执行后面同步的代码。 2.主线程 遇到同步的代码,就在主线程里面直接执行了。 3.任务队列 遇到异步的…

ROS TF坐标变换 - 静态坐标变换

目录 一、静态坐标变换&#xff08;C实现&#xff09;二、静态坐标变换&#xff08;Python实现&#xff09; 如前文所属&#xff0c;ROS通过广播的形式告知各模块的位姿关系&#xff0c;接下来详述这一机制的代码实现。 模块间的位置关系有两种类型&#xff0c;一种是相对固定…

Django开发3

Django开发3 Django开发编辑用户9.靓号管理9.1 表结构9.2 靓号列表9.3 新建靓号9.4 编辑靓号9.5 搜索手机号9.6 分页 10.时间插件11.ModelForm和BootStrap操作 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; Django开发 部门管…

RK3588取经之路【序章】2024/01/01

文章目录 RK3588取经之路【序章】关于本文的规划 开篇开发板整体图外设介绍 结束 RK3588取经之路【序章】 2023年前入手买了这个广州英码出场的一款开发板EVM3588-A24EG-C-B2AA&#xff08;裸板&#xff09;&#xff0c;花了2800左右&#xff0c;是不是脑子有点毛病&#xff0…

超详细YOLOv8目标检测全程概述:环境、训练、验证与预测详解

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 搭建环境说明 不同版本模型性能对比 不同版本对比 模型参数解释 不同版本说明 训练 训练示意代码 训练用数据集与 .yaml 配置方法 .yaml配置 数据说明 数据集路径 训练参数说明 训练过程…

linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控

一、安装 Docker 和 Docker Compose https://docs.docker.com/get-docker/ # 安装 Docker sudo apt-get update sudo apt-get install -y docker.io# 安装 Docker Compose sudo apt-get install -y docker-compose二、创建配置文件及测试平台是否正常 1、选个文件夹作为自建…

【Linux】修复 Linux 错误 - 权限被拒绝

修复 Linux 错误 - 权限被拒绝 问题描述 在使用 Linux 操作系统时,有时会遇到权限被拒绝的错误。这种错误通常发生在尝试执行需要特定权限的操作时,例如修改系统文件或访问受限的目录。当权限被拒绝时,系统会返回类似于“Permission denied”或“Operation not permitted”…

Airtest的iOS实用接口介绍

前段时间Airtest更新了1.3.0.1版本&#xff0c;里面涉及非常多的iOS功能新增和改动&#xff0c;今天想详细跟大家聊一下里面的iOS设备接口。 PS&#xff1a;本文示例均使用本地连接的iOS设备&#xff0c;Airtest版本为1.3.0.1 。 安装接口&#xff1a;install、install_app …

2.1 DFMEA步骤一:策划和准备

2.1.1 目的 设计FMEA的“策划和准备”步骤旨在确定将要执行的FMEA类型,以及根据进行中的分析类型(如系统、子系统或组件)明确每个FMEA的范围。设计FMEA(DFMEA)的主要目标包括: 项目识别项目计划:涵盖目的、时间安排、团队、任务和工具(5T)分析边界:界定分析的范围,…

java编程思路思想及案例练习(最近学习总结)

前言&#xff1a; 学了java的基础语法&#xff0c;但运用还不是很流畅&#xff0c;所以练习些案例&#xff0c;整理些心得。 编程思路思想 1&#xff0c;实验由多个方法组成&#xff0c;所以碰到需要实现的程序时&#xff0c;需要先分析程序&#xff0c;思考程序可以拆分成什么…

GPT4-AIl本地部署-chat AI本地使用

文章目录 GPT4-AIl本地部署GPT4客户端下载地址&#xff1a;对应的下载下载后的文件点击安装&#xff0c;改一下文件存放路径&#xff0c;下面都是默认下一步进度条100%后&#xff0c;点击完成 安装完桌面生成图标&#xff0c;点击选择都是NO&#xff0c;不进行数据上传点击后&a…

TensorFlow Hub模型

TensorFlow Hub是一个库&#xff0c;用于分享和发现预训练的机器学习模型。 可以在TensorFlow Hub上找到各种用于不同任务的模型&#xff0c;包括但不限于以下类型&#xff1a; 文本处理: BERT (Bidirectional Encoder Representations from Transformers)ALBERT (A Lite BERT…

大数据 - 大数据入门第一篇 | 关于大数据你了解多少?

&#x1f436;1.1 概述 大数据&#xff08;BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…