算法工程师第五天(● 哈希表理论基础 ● 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 False
        for char in sList:
            if sList.count(char) != tList.count(char):
                return False
        return True

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

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        # 定义一个列表,存放的是每个字母出现的个数,然后初始值都为0,先遍历一个列表,左++,另外一个列表做--,如果定义的这个列表中出现了不是为0的说明,要么一个列表多了,要么少了
        indexList = [0] * 26
        for i in s:  # 先统计s这个字符串每个字母出现的次数
            indexList[ord(i) - ord("a")] += 1
        for i in t:  # 遍历t上一个字符串中每个字母出现的次数做--,操作,如果为零,说明s,和,t的每个字符出现的次数同一样
            indexList[ord(i) - ord("a")] -= 1
        
        for i in indexList:
            if i != 0:
                return False
        return 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] *  1001
        aid2 = [0] * 1001
        for i in nums1:
            aid1[i] += 1
        for j in nums2:
            aid2[j] += 1
        r = []
        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) ** 2
            if num_sum == 1:  # 如果各个位上平方之和 == 1说明已经找到了
                return True
            else:  # 否则跟新n
                n = num_sum
        return 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] * 100000
        for index, value in enumerate(nums):
            if target - value in li:  # 就是用目标值减去当前遍历的值,然后在判断剩下的部分是否在之前的字典中
                return [li.index(target - value), index]
            li[index] = value
        return []
        

字典版本:

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] = index
        return []
        

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 基础知识:为什么使用 __init__.py ?

大家好&#xff01;今天&#xff0c;我们将深入了解 Python 中的 __init__.py 文件&#xff0c;这个小文件却能干大事。让我们抛开任何专业术语&#xff0c;直接进入正题。 什么是 __init__.py &#xff1f; 假设你有一个 Python 目录&#xff0c;里面有一堆 Python 文件&…

从零开始做题:My_lllp

题目 给出一张png图片 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/题目/zulu/My_lllp] └─$ python2 lsb.py extract my_lllp.png out.txt my_lllp [] Image size: 1080x1079 pixels. [] Written extracted data to out.txt. ┌──(holyeyes㉿kali2023)-[~/Misc/题目/zul…

绝区伍--2024年AI发展路线图

2024 年将是人工智能具有里程碑意义的一年。随着新模式、融资轮次和进步以惊人的速度出现&#xff0c;很难跟上人工智能世界发生的一切。让我们深入了解 2024 年可能定义人工智能的关键事件、产品发布、研究突破和趋势。 2024 年第一季度 2024 年第一季度将推出一些主要车型并…

AI绘画Stable Diffusion:ControlNet组件—Scribble(涂鸦)赋予用户精细控制权,让涂鸦草图焕发生命力

大家好&#xff0c;我是画画的小强 今天给大家分享一下AI绘画Stable Diffusion当中的&#xff1a;ControlNet Scribble组件&#xff0c;**Scribble&#xff08;涂鸦&#xff09;**技术是一种能够为用户提供独特的手动注释或标记图像&#xff08;如&#xff1a;涂鸦、简笔画等&…

变阻器的阻值范围是多少?

变阻器&#xff0c;又称可变电阻器或电位器&#xff0c;是一种可以改变电阻值的电子元件。它通常由一个滑动臂、一个固定电阻体和一个滑动触点组成。通过滑动臂在固定电阻体上的位置变化&#xff0c;可以实现对电阻值的连续调整。变阻器广泛应用于各种电子设备中&#xff0c;如…

2024 ACT汽车软件与安全技术周 | 龙智携全方位汽车软件开发解决方案亮相,助力应对汽车软件开发功能安全、合规等挑战

2024年7月18-19日&#xff08;周四-周五&#xff09;&#xff0c;2024第三届ACT汽车软件与安全技术周将在上海佘山翰悦阁酒店举办。 龙智即将携汽车开发及管理解决方案创新亮相&#xff0c;并在汽车信息安全技术峰会主会场上发表主题演讲&#xff0c;分享推动汽车软件开发与功…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…

电源中电感底部需要铺地平面吗?

感有交变电流&#xff0c;电感底部铺铜会在地平面上产生涡流&#xff0c;涡流效应会影响功率电感的电感量&#xff0c;涡流也会增加系统的损耗&#xff0c;同时交变电流产生的噪声会增加地平面的噪声&#xff0c;会影响其他信号的稳定性。 在EMC方面来看&#xff0c;在电感底部…

DSSM双塔特征交互

传统的DSSM双塔无法在早期进行user和item侧的特征交互&#xff0c;这在一定程度上降低了模型性能。我们想要对双塔模型进行细粒度的特征交互&#xff0c;同时又不失双塔模型离线建向量索引的解耦性。下面介绍两篇这方面的工作。 美团-Dual Augmented Two-tower 在user和item的特…

基于stm32开发的红外循迹小车

本项目算是接触32来开发的第一个小项目了&#xff0c;虽然前期用51写过一个循迹小车&#xff0c;以为直接转到32会比较简单&#xff0c;结果还是花了大几天才把小车的参数完全调完&#xff0c;以此来记录下自己的学习历程&#xff08;注&#xff1a;循迹算法并未加入PID算法&am…

AI网络爬虫016:用deepseek批量提取coze扣子的智能体数据

文章目录 一、介绍二、输入内容三、输出内容一、介绍 动态加载页面,返回json数据: 翻页规律: https://www.coze.cn/api/marketplace 这两个URL在多个方面有所不同,主要差异如下: **查询参数(Query Parameters)**: - 第一个URL的查询参数包括: - `entity_type=1` - `…

【VUE基础】VUE3第七节—Vue Router路由基础

Vue Router 是 Vue 官方的客户端路由解决方案。 客户端路由的作用是在单页应用 (SPA) 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时&#xff0c;URL 会随之更新&#xff0c;但页面不需要从服务器重新加载。 Vue Router 基于 Vue 的组件系统构建&…

imazing电脑怎么下载 imazing怎么下载软件 使用iMazing下载和卸载Apple设备上的应用程序

iMazing官方版是一款管理苹果设备的软件&#xff0c;是一款帮助用户管理 iOS手机的PC端应用程序&#xff0c;能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;功能比iTunes更…

rocketmq主从自动切换(Controller 嵌入 NameServer 部署)

rocketmq5以后&#xff0c;加入了主从自动切换的功能&#xff1a; 官网 https://rocketmq.apache.org/zh/docs/deploymentOperations/03autofailover 准备工作 1&#xff09;关闭将要升级的nameserver、master、slave 2&#xff09;复制master的store文件到其他两台机器&a…

240708_昇思学习打卡-Day20-MindNLP ChatGLM-6B StreamChat

240708_昇思学习打卡-Day20-MindNLP ChatGLM-6B StreamChat 基于MindNLP和ChatGLM-6B实现一个聊天应用&#xff0c;本文进行简单记录。 环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mi…

通过高德地图 JS API实现单击鼠标进行标注

效果图: 核心代码: <template><a-modal title="选择地图所在位置" :width="width" :visible="visible" @ok="handleOk" @cancel="handleCancel" cancelText="关闭"><div class="location-…

Flutter——最详细(Badge)使用教程

背景 主要常用于组件叠加上圆点提示&#xff1b; 使用场景&#xff0c;消息数量提示&#xff0c;消息红点提示 属性作用backgroundColor红点背景色smallSize设置红点大小isLabelVisible是否显示offset设置红点位置alignment设置红点位置child设置底部组件 代码块 class Badge…

【Elasticsearch】开源搜索技术的演进与选择:Elasticsearch 与 OpenSearch

开源搜索技术的演进与选择&#xff1a;Elasticsearch 与 OpenSearch 1.历史发展2.OpenSearch 与 Elasticsearch 相同点3.OpenSearch 与 Elasticsearch 不同点3.1 版本大不同3.2 许可证不同3.3 社区不同3.4 功能不同3.5 安全性不同3.6 性能不同3.7 价格不同3.8 两者可相互导入 4…

LLM- 注意力机制

一&#xff1a;什么是注意力机制&#xff0c;以及产生背景&#xff1f; &#xff08;1&#xff09;&#xff1a;RNN模型[RNN模型]的缺点&#xff1a;下图是例如RNN模型解决机器翻译的例子&#xff0c;从这个例子可以看到Encoder最后一个向量&#xff08;eos&#xff09;送给了…

Open3D 从体素网格构建八叉树

目录 一、概述 1.1体素网格 1.2八叉树构建 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2体素网格 3.3八叉树 3.4体素网格 一、概述 八叉树&#xff08;Octree&#xff09;是一种树状数据结构&#xff0c;用于递归地将三维空间划分为…