算法工程师第五天(● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和 )

参考文献 代码随想录

一、有效的字母异位词

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

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

示例 1:

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

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

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

解法1:在python中使用统计某个字符,然后在判断与另外一个列表中的字符是否相等,需要注意的是,它们的长度必须相等,如果不想等的话,那么久返回False,一下这个方法仅供参考,因为本人也没有通过(超时)超时的原因:就是你每次都要寻找一次,有写字母已经判断过了,但是这个思路仍然需要进行统计字符出现的次数,而且统计字母次数的时间复杂度为O(n),所以就超时了

class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool"""# 可以把它们转化为列表的形式,然后在统计每个字母的次数是否已与另外一个字符列表相等(两个字符列表相等的情况下,还有不相等的情况,那肯定就返回False)sList = list(s)tList = list(t)if len(sList) != len(tList):return Falsefor char in sList:if sList.count(char) != tList.count(char):return Falsereturn True

解法二:通过字典来计数,先统计提一个字符串中每个字符出现的次数,然后,在根据另外一个字符串中每个字母出现,来--,如果,对应的值都为0,说明,两个字符串中每个字母出现的次数刚好相等,否则,要么一个字符的字母多了,或者少了。

class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool"""# 定义一个列表,存放的是每个字母出现的个数,然后初始值都为0,先遍历一个列表,左++,另外一个列表做--,如果定义的这个列表中出现了不是为0的说明,要么一个列表多了,要么少了indexList = [0] * 26for i in s:  # 先统计s这个字符串每个字母出现的次数indexList[ord(i) - ord("a")] += 1for i in t:  # 遍历t上一个字符串中每个字母出现的次数做--,操作,如果为零,说明s,和,t的每个字符出现的次数同一样indexList[ord(i) - ord("a")] -= 1for i in indexList:if i != 0:return Falsereturn True

二、两个数组的交集

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

示例 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

解法1:判断第一个数组里面的元素是否在另外一数组里面,如果存在,那么就添加到另外一临时数组里,否则什么也不做操作。

class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""aid = []for i in nums1:if i in nums2:aid.append(i)return list(set(aid))

解法二:使用集合,求交集即可

class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""a = set(nums1)b = set(nums2)return list(a & b)

解法三:使用2个数组,分别存储每个列表中的元素,如果两个列表对应的值大于1,说明了,是交集

class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""aid1 = [0] *  1001aid2 = [0] * 1001for i in nums1:aid1[i] += 1for j in nums2:aid2[j] += 1r = []for i in range(1001):if aid1[i] * aid2[i] > 0:r.append(i)return r 

三、快乐数

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

问题分析:首先要考虑的是,如何防止死循环,可以使用一个列表来存储,如果它出现了2次说明已经死循环,就可以调出了,否则就添加到列表中,然后统计每个各位上平方之和,在判断是否为1,如果不是那么就要跟新到n的值

class Solution(object):def isHappy(self, n):""":type n: int:rtype: bool"""record = []  # 为了下面的判断,不要陷入死循环while n not in record:record.append(n)  # 把这个数添加到列表中,防止死循环num_sum = 0  # 记录每次数的各个位上平方之和n_str = str(n)for i in n_str:num_sum += int(i) ** 2if num_sum == 1:  # 如果各个位上平方之和 == 1说明已经找到了return Trueelse:  # 否则跟新nn = num_sumreturn False

四、两数之和

        给定一个整数数组 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]

提示:

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

问题分析:我们可以把当前遍历的数添加到一个数组或者是字典里,然后在循环里,先判断目标数-当前循环的元素是否在之前的数组或者是字典里,如果在那么返回对应的下标,如果不在,则返回空数组

数组版本:

        在Python中,对于频繁的数据访问操作,数组(通常指列表,即list类型)和字典(dict类型)的效率差别不大。数组的访问时间复杂度是O(1),而字典的平均时间复杂度是O(1),看起来似乎都是常数级别的时间复杂度。

但在特定情况下,数组和字典的表现可能会有明显差异:

  1. 数组(列表):适合当你需要通过索引来快速访问元素,或者在列表末尾频繁添加或删除元素。

  2. 字典:适合当你需要通过键来快速访问元素,并且不关心元素的顺序或者它们的添加/删除频率。

如果你需要频繁地通过键来访问元素,并且不需要关心元素的顺序,使用字典会更高效。

如果你需要保持元素的插入顺序,并且需要通过索引来频繁访问元素,或者你需要在列表的任意位置频繁插入和删除元素,使用数组(列表)会更高效。

在实际应用中,除非有极端的性能需求,否则通常不需要过度关注哪个更高效,而是根据需求选择合适的数据结构

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 使用的是数组li = [100000000000000] * 100000for index, value in enumerate(nums):if target - value in li:  # 就是用目标值减去当前遍历的值,然后在判断剩下的部分是否在之前的字典中return [li.index(target - value), index]li[index] = valuereturn []

字典版本:

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 使用的是字典aid = {}for index, value in enumerate(nums):if target - value in aid:  # 就是用目标值减去当前遍历的值,然后在判断剩下的部分是否在之前的字典中return [aid[target - value], index]aid[value] = indexreturn []

为什么不写aid[index] = value呢?因为当你查找剩下的数的下标的时候不知道,这时你就知道当前元素的下标而已,但你不知道剩下元素的下标是多少,也可以使用其它方法来寻找,但是这些方法不常用

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

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

相关文章

风险评估:Tomcat的安全配置,Tomcat安全基线检查加固

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址&#xff1a;3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

高职物联网实训室

一、高职物联网实训室建设背景 随着《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》的发布&#xff0c;中国正式步入加速数字化转型的新时代。在数字化浪潮中&#xff0c;物联网技术作为连接物理世界与数字世界的桥梁&#xff0c;其重要性日益凸显…

Golang | Leetcode Golang题解之第224题基本计算器

题目&#xff1a; 题解&#xff1a; func calculate(s string) (ans int) {ops : []int{1}sign : 1n : len(s)for i : 0; i < n; {switch s[i] {case :icase :sign ops[len(ops)-1]icase -:sign -ops[len(ops)-1]icase (:ops append(ops, sign)icase ):ops ops[:len(o…

Knife4j的原理及应用详解(三)

本系列文章简介&#xff1a; 在当今快速发展的软件开发领域&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;作为不同软件应用之间通信的桥梁&#xff0c;其重要性日益凸显。随着微服务架构的兴起&#xff0c;API的数量…

价值投资者什么时候卖出股票?

经常有人说&#xff0c;会买的只是徒弟&#xff0c;会卖的才是师傅。 在阅读《战胜华尔街》的过程中&#xff0c;也多次感受到林奇先生的卖出逻辑&#xff0c;当股票的价格充分体现了公司的价值的时候&#xff0c;就是该卖出股票的时候。但这只是理论上的&#xff0c;从林奇先…

数据中台指标管理系统

您所描述的是一个数据中台指标管理系统&#xff0c;它基于Spring Cloud技术栈构建。数据中台是企业数据管理和应用的中心平台&#xff0c;它整合了企业内外部的数据资源&#xff0c;提供数据服务和数据管理能力。以下是您提到的各个模块的简要概述&#xff1a; 1. **首页**&am…

JSP WEB开发(四) MVC模式

MVC模式介绍 MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;最早出现在Smalltalk语言中&#xff0c;后来在Java中得到广泛应用&#xff0c;并被Sun公司推荐为Java EE平台的设计模式。它把应用程序分成了三个核心模块&#xff1a;模型层、视…

2024年有多少程序员转行了?

疫情后大环境下行&#xff0c;各行各业的就业情况都是一言难尽。互联网行业更是极不稳定&#xff0c;频频爆出裁员的消息。大家都说2024年程序员的就业很难&#xff0c;都很焦虑。 在许多人眼里&#xff0c;程序员可能是一群背着电脑、进入高大上写字楼的职业&#xff0c;他们…

SVN 80道面试题及参考答案(2万字长文)

目录 解释SVN的全称和主要功能。 SVN与CVS相比,有哪些主要改进? 描述SVN的工作流程。 什么是版本库(repository)?它存储了什么? 解释工作副本(working copy)的概念。 SVN如何处理文件的版本控制? SVN中的“commit”是什么意思? 解释“update”操作的作用。 如何…

Datawhale AI 夏令营 机器学习挑战赛

一、赛事背景 在当今科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的深度和广度渗透到科研领域&#xff0c;特别是在化学及药物研发中展现出了巨大潜力。精准预测分子性质有助于高效筛选出具有优异性能的候选药物。以PROTACs为例&#x…

Hi3861 OpenHarmony嵌入式应用入门--MQTT

MQTT 是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输 协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用&#xff0c;是专为受限设备和低带宽、 高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器…

AutoMQ 生态集成 Kafdrop-ui

Kafdrop [1] 是一个为 Kafka 设计的简洁、直观且功能强大的Web UI 工具。它允许开发者和管理员轻松地查看和管理 Kafka 集群的关键元数据&#xff0c;包括主题、分区、消费者组以及他们的偏移量等。通过提供一个用户友好的界面&#xff0c;Kafdrop 大大简化了 Kafka 集群的监控…

量产工具一一UI系统(四)

目录 前言 一、按钮数据结构抽象 1.ui.h 二、按键处理 1.button.c 2.disp_manager.c 3.disp_manager.h 三、单元测试 1.ui_test.c 2.上机测试 前言 前面我们实现了显示系统框架&#xff0c;输入系统框架和文字系统框架&#xff0c;链接&#xff1a; 量产工具一一显…

Redis 底层数据结构

• 简单动态字符串 • 链表 • 字典 • 跳跃表 • 整数集合 • 压缩列表 • 对象 SDS 增加了len和free属性&#xff0c;记录buf数组的使用空间和剩余空间。好处:strken函数直接读取len值&#xff0c;时间复杂度是O(1)&#xff1b;预分配buf长度&#xf…

集控中心操作台材质选择如何选择

作为集控中心的核心组成部分&#xff0c;操作台不仅承载着各种设备和工具&#xff0c;更是工作人员进行监控、操作和管理的重要平台。因此&#xff0c;选择适合的集控中心操作台材质显得尤为重要。 一、材质选择的考量因素 在选择集控中心操作台材质时&#xff0c;我们需要综合…

SpringCloud跨微服务的远程调用,如何发起网络请求,RestTemplate

在我们的业务流程之中不一定都会是自己模块查询自己模块的信息&#xff0c;有些时候就需要去结合其他模块的信息来进行一些查询完成相应的业务流程&#xff0c;但是在SpringCloud每个模块都相对独立&#xff0c;数据库也有数据隔离。所以当我们需要其他微服务模块的信息的时候&…

什么是SpringCloud Stream?

Spring Cloud Stream 是一个构建消息驱动微服务的框架&#xff0c;其基于Spring Boot来开发&#xff0c;并使用Spring Integration来连接消息代理中间件。该项目的目标是提供一套用于开发消息驱动应用的通用模型&#xff0c;并定义了用于发送和接收消息的绑定器&#xff08;Bin…

前端javascript中的排序算法之选择排序

选择排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 是一种原址排序法&#xff1b; 将数组分为两个区间&#xff1a;左侧为已排序区间&#xff0c;右侧为未排序区间。每趟从未排序区间中选择一个值最小的元素&#xff0c;放到已排序区间的末尾&#xff0c;从…

玩转springboot之为什么springboot可以直接执行

为什么springboot可以直接执行 先看一下springboot打包生成的MANIFEST.MF内容是什么 Manifest-Version: 1.0Implementation-Title: exam-adminImplementation-Version: 1.0-SNAPSHOTStart-Class: com.zhanghe.exam.ApplicationSpring-Boot-Classes: BOOT-INF/classes/Spring-Bo…