Leetcode刷题笔记6:哈希表1

导语

leetcode刷题笔记记录,本篇博客记录哈希表部分的题目,主要题目包括:

  • 242 有效的字母异位词
  • 349 两个数组的交集
  • 202 快乐数
  • 1 两数之和

知识点

哈希表

哈希表(Hash table,散列表)是根据查找元素的值而直接进行访问的数据结构。一般哈希表都是用来快速判断一个元素是否出现集合里。

一般在Leetcode题目中我们有三种应用哈希表的形式,分别是:

  • 数组,应用于数字范围不太大的情形;
  • 集合,应用于数字范围很大的情形;
  • map,应用于还有其他对应值需要保存的情形。

Leetcode 242 有效的字母异位词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意: 若 s 和 t **中每个字符出现的次数都相同,则称 s 和 t **互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

解法

这道题目直接使用数组或者字典map就可以解决,解法如下:

# 数组解法
class Solution:def isAnagram(self, s: str, t: str) -> bool:if len(s) != len(t):return Falses_l ,t_l = [0] *26, [0]*26for s_char in s:s_l[ord(s_char)-ord("a")] += 1for t_char in t:t_l[ord(t_char)-ord("a")] += 1for i in range(26):if s_l[i] != t_l[i]:return Falsereturn True# map解法
class Solution:def isAnagram(self, s: str, t: str) -> bool:ss, tt = dict(), dict()for char in s:ss[char] = ss.get(char, 0) + 1for char in t:tt[char] = tt.get(char, 0) + 1return ss == tt

Leetcode 349 两个数组的交集

题目描述

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

示例 1:

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

提示:

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

解法

这道题目可以直接使用集合来实现,非常简洁。

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:return list(set(nums1) & set(nums2))

Leetcode 202 快乐数

题目描述

编写一个算法来判断一个数 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

提示:

  • 1 <= n <= 2^31 - 1

解法

这道题目乍一看是一道数学问题,其实并不是!题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

解题代码如下:

class Solution:def isHappy(self, n: int) -> bool:def get_sum(n):ans = 0while n:n, r = divmod(n, 10)ans += r ** 2return ansresult_s = set()result = get_sum(n)while result not in result_s:if result == 1:return Trueresult_s.add(result)result = get_sum(result)return False

Leetcode 1 两数之和

题目描述

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

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

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

示例 1:

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

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

进阶: 你可以想出一个时间复杂度小于 O(n2) 的算法吗?

解法

当需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。本题需要一个集合来存放遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过。因为本题不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key-value结构来存放,key来存元素,value来存下标,那么使用map正合适

那么为什么不使用数组和set呢?这里有几点考虑:

  • 数组大小受限,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而这道题目不仅要判断y是否存在而且还要下标,因为要返回x和y的下标。所以set也不能用。

此时就要选择另一种数据结构:map ,map是一种key-value的存储结构,可以用key保存数值,用value在保存数值所在的下标。在Python中可以很方便的通过字典来实现。

完整代码如下:

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:hashtable = dict()for i, num in enumerate(nums):index = hashtable.get(target-num, -1)if  index != -1:return [i, index]else:hashtable[num] = ireturn [-1, -1]

易错点

divmod

在Python中,divmod()函数是一个内置函数,用于执行整数的除法和取余运算,并以元组的形式返回结果。divmod()函数接受两个参数,通常用于执行两个整数的除法操作。它将第一个参数除以第二个参数,并返回一个包含两个值的元组,第一个值是整数除法的商,第二个值是整数除法的余数。语法:

divmod(x, y)

参数说明:

  • x: 被除数(整数)
  • y: 除数(整数)

返回值: divmod()函数返回一个包含两个值的元组 (quotient, remainder) ,其中 quotient 是整数除法的商, remainder 是整数除法的余数。

示例:

result = divmod(10, 3)
print(result)  # 输出:(3, 1)# 可以通过元组的解包来获取商和余数
quotient, remainder = divmod(15, 4)
print("Quotient:", quotient)     # 输出:Quotient: 3
print("Remainder:", remainder)   # 输出:Remainder: 3

在上面的示例中,divmod(10, 3)执行整数除法,商为3,余数为1,并返回一个元组(3, 1)divmod(15, 4)也执行整数除法,商为3,余数为3,通过元组的解包分别将商和余数赋值给了quotientremainder变量。

参考

  • 代码随想录
  • 题解

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

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

相关文章

汇编原理(四)[BX]和loop指令

loop&#xff1a;循环 误区&#xff1a;在编译器里写代码和在debug里写代码是不一样的&#xff0c;此时&#xff0c;对于编译器来说&#xff0c;就需要用到[bx] [bx]: [bx]同样表示一个内存单元&#xff0c;他的偏移地址在bx中&#xff0c;比如下面的指令 move bx, 0 move ax,…

永恒之蓝(MS17-010)详解

这个漏洞还蛮重要的&#xff0c;尤其在内网渗透和权限提升。 目录 SMB简介 SMB工作原理 永恒之蓝简原理 影响版本 漏洞复现 复现准备 复现过程 修复建议 SMB简介 SMB是一个协议服务器信息块&#xff0c;它是一种客户机/服务器、请求/响应协议&#xff0c;通过SMB协议…

89、JPEG格式图像数据解析+串口传输JPEG解析

JPEG格式传输以&#xff08;段标记SOI&#xff09;0xFF 0xD8开始&#xff0c;&#xff08;段标记EOI&#xff09;0xFF 0xD9结束 解析JPEG格式数据驱动文件&#xff1a; jpeg_driver.h #ifndef _jpeg_driver_H_ #define _jpeg_driver_H_ #ifdef __cplusplus extern "C&quo…

dubbo复习:(11)使用grpc客户端访问tripple协议的dubbo 服务器

一、服务器端依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

头歌数据库备份与恢复

第一 mysql -uroot -p123123 -h127.0.0.1 < /data/workspace/myshixun/src/data.sql mysqldump -u root -p studb student> /student_bk.sql mysql -uroot -p123123 -h127.0.0.1 -e "create database studb2;" mysql -u root -p123123 studb2 < /student_bk…

【kubernetes】陈述式资源管理的kubectl命令合集

目录 前言 一、K8s 资源管理操作方式 1、声明式资源管理方式 2、陈述式资源管理方式 二、陈述式资源管理方式 1、kubectl 命令基本语法 2、查看基本信息 2.1 查看版本信息 2.2 查看资源对象简写 2.3 配置kubectl命令自动补全 2.4 查看node节点日志 2.5 查看集群信息…

01 Nginx安装部署(系列篇)

一、安装部署 1、Nginx的发行版本 常用版本分为四大阵营&#xff1a; Nginx 开源版 | https://nginx.org/&#xff1a;赤裸裸的Web服务器、反向代理、负载均衡&#xff08;功能少&#xff0c;开发难度大&#xff09; Nginx Plus 商业版 | https://www.nginx.com/&#xff1a;…

高职物联网专业嵌入式系统开发教学解决方案

前言 随着人工智能与物联网技术的深度融合&#xff0c;物联网&#xff08;AIoT&#xff09;已成为推动产业发展的重要力量。高职物联网专业作为培养技术人才的重要基地&#xff0c;面临着课程体系更新、教学内容优化的迫切需求。嵌入式系统开发作为物联网专业的核心课程之一&a…

[CVPR-24] HUGS: Human Gaussian Splats

本文提出一种新的数字人表征Human Gaussian Splats (HUGS)&#xff0c;可以实现新姿态和新视角生成&#xff1b;本文提出一种新的前向形变模块&#xff08;forward deformation module&#xff09;&#xff0c;在标定空间基于Gaussians表征数字人&#xff0c;并基于LBS学习如何…

秘钥托管技术简介

目录 前言 一、秘钥托管是什么&#xff1f; 二、秘钥托管技术简介 1. Skipjack算法 2. LEAF产生过程示意图 3. 对加密通信的法律实施存取过程 总结 前言 1993年4月&#xff0c;美国政府为了满足其电信安全、公众安全和国家安全&#xff0c;提出了托管加密标准EES (escro…

Aria2下载安装使用

目录 下载Aria2 配置创建 aria2.conf 文件创建 aria2.session 文件 Aria2的使用基础使用多源下载多线程下载后台下载配置文件启动 AriaNg下载安装AriaNg配置AriaNg使用 Tracker 列表 aria2 是一款免费开源跨平台且不限速的多线程下载软件&#xff0c;其优点是速度快、体积小、资…

慧尔智联携纷享销客启动CRM项目 推进客户经营升级与内外高效协作

智慧农业领军企业慧尔智联携手纷享销客&#xff0c;启动CRM客户经营管理系统项目。双方将深入合作&#xff0c;全面落实慧尔智联发展策略&#xff0c;持续提升数字化经营管理水平&#xff0c;实现内部团队信息化高效协作&#xff0c;以快速响应市场需求&#xff0c;提升客户满意…

开源集运wms系统

集运WMS系统是一种专为集运业务设计的仓库管理系统&#xff0c;它能够高效地处理来自多个来源的货物&#xff0c;优化存储和发货流程。 经过长时间的开发和测试&#xff0c;推出了我的集运WMS系统。它不仅具备传统WMS系统的所有功能&#xff0c;还针对集运业务的特点进行了特别…

HNU-计算机体系结构-小班讨论-GoogleTPU的发展历程与思考

因为对GPU比较感兴趣&#xff0c;故选择这个作为汇报课题。

JEPaaS 低代码平台 accessToTeanantInfo SQL注入漏洞复现

0x01 产品简介 JEPaaS低代码开发平台开源版 旨在帮助企业快速实现信息化和数字化转型。该平台基于可视化开发环境,让软件开发人员和业务用户通过直观的可视化界面来构建应用程序 ,而不是传统的编写代码方式。 用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和…

智能合约革命:Web3引领智能化商业的未来

随着区块链技术的日益成熟和普及&#xff0c;智能合约作为其重要应用之一&#xff0c;正在逐渐改变着商业世界的面貌。Web3作为下一代互联网的代表&#xff0c;以其去中心化、加密安全的特性&#xff0c;为智能合约的发展提供了无限可能&#xff0c;将智能合约应用于商业领域的…

对简单工厂模式、工厂方法模式、抽象工厂模式的简单理解

简单工厂模式 三部分组成 抽象类一些抽象类的具体实现类工厂类 把创建对象的任务交给一个工厂类来实现&#xff0c;对业务进行封装。 优点&#xff1a;实现了任务分离&#xff0c;客户端不用关心业务的具体实现&#xff0c;交由工厂来“生产”。 缺点&#xff1a;违背开闭原…

使用控制台方式部署sentinel

1.下载控制台jar包 2.运行jar包 java -jar sentinel-dashboard-1.8.0.jar 也可以通过编写批处理文件指定端口、用户名、密码&#xff1a; 客户端添加依赖&#xff08;后续整合springcloudalibaba时不需要此依赖&#xff09; 如修改了sentinel端口&#xff0c;需要添加客户端运…

Springboot项目搭建 jdk1.8

1.idea创建项目 2.项目配置 maven 编辑项目编码 删除无用文件 修改配置文件后缀&#xff0c;设置数据库 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/honey2024?useSSLfalse&useUnicodetrue&characterEncodingUT…

力扣每日一题 5/29

2981.找出出现至少三次的最长特殊子字符串I 题目&#xff1a; 给你一个仅由小写英文字母组成的字符串 s 。 如果一个字符串仅由单一字符组成&#xff0c;那么它被称为 特殊 字符串。例如&#xff0c;字符串 "abc" 不是特殊字符串&#xff0c;而字符串 "ddd&q…