代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的交集、leetcode202.快乐数、leetcode1.两数之和

news/2024/10/21 15:28:55

1. leetcode 242.有效的字母异位词

题目链接:242. 有效的字母异位词 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili

自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对这个数据进行排序,排序完后就输出两个字符串相等或者不等的值

1.1 自己写的代码

自己做题的思路就是暴力搜索,调用内部的函数进行计算

class Solution:def isAnagram(self, s: str, t: str) -> bool:s.split()t.split()s_l = list(s)t_l = list(t)s_l.sort()t_l.sort()return s_l== t_l

1.2 哈希表的方法

1.2.1哈希表的思路
  1. 字符串总共有26个,所以建立一个可以容纳26个字符串的哈希表,初始值为0

  2. 统计第一个字符串s中每个字母出现的次数,这里计算就是用字符串位置减去第一个字母即'a'的值,计算两个字符串的值在python中转化为对ASCII码计算,函数是ord(),然后就是统计每个字符串出现的次数,对其数值进行相加

  3. 对第二个字符串t中的数据对哈希表进行一个减法的操作

  4. 对字符串中的字符进行循环,如果哈希表的值有不等于0的,则证明两个字符串不相等,否则就是相等

1.2.2 哈希表的代码
class Solution:def isAnagram(self, s: str, t: str) -> bool:record = [0]*26for i in s:record [ord(i)-ord('a')] +=1for j in t:record [ord(j)-ord('a')]-=1for i in range(26):if (record[i]!=0):return Falsereturn True

1.3 本题小结

  1. 定义哈希表为数组的方法:recode= [0]*26
  2. 这种题一般就是会有一个简单的思路来做,但是这种思路的缺点就是计算时间会比较久,用哈希表的方法会节省很多的计算时间

2. leetcode 349.两个数组的交集

题目链接:349. 两个数组的交集 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili

自己的思路:首先就是创建一个空列表,然后对第一个列表里面的数据进行循环,如果第一个列表的数据在第二个列表中,就对空列表进行数据增加,最后使用set对其进行去重,输出

2.1 自己的思路

这种方法有一种暴力搜索的感觉

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:l = list()for i in nums1:if i in nums2:l.append(i)return list(set(l))

2.2 哈希表的方法

这道题数据最长在1000,所以进行哈希表的时候其实使用set和数组都是可以的

2.2.1 set哈希表的方法

发现python中直接使用集合的方式真的简单

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:return list(set(nums1) & set(nums2))
2.2.2 哈希表数组的方式

fun1

思路

  1. 首先建立两个空数组,初始值都为0
  2. 对两个数组进行判断,然后存储至这个空列表中
  3. 出错点:如何判断这两个已有数组的值是否相等,不是对其直接进行等于,这样没有用的哈希表的值也会进行相加,所以这里就是对二者的数值进行,然后判断有的话进行列表数组加,没有则继续循环
class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:num_l1 = [0]*1005num_l2 = [0]*1005result = []for i in nums1:num_l1[i] +=1for j in nums2:num_l2[j] +=1for k in range(1005):if num_l1[k]*num_l2[k]>0:result.append(k)return result

fun2

思路:

  1. 创建一个空集合
  2. 对第一个数组的数进行循环,然后将其值添加值哈希表中
  3. 对第二个数组的值进行判断,如果第二个值的索引值和哈希表中规定的值相等,在空集合中添加第二个数组的下标
  4. 最后对这个集合使用列表进行返回即可
class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:set_num = set()num = [0]*1005for i in nums1:num[i] = 1for j in nums2:if num[j]==1:set_num.add(j)return list(set_num)

2.3 本题小结

  1. 集合方式在python中非常简单,即判断两个集合的交集即可进行输出
  2. 数组的方式则很重要的一点就是数组啥时候对数据相加,则是其值相乘大于0的时候。

3. leetcode 202.快乐数

题目链接:202. 快乐数 - 力扣(LeetCode)

文章链接:代码随想录

自己的思路:首先就是有一个东西去存储,存储的是n的每个位数数值平方的和,然后对这个数据进行判断,如果等于1了就返回真,否则就返回假。但是自己无法编译出来,其实,,,

3.1 集合的思路

思路

  1. 首先就是计算这个每位数平方的和
  2. 创建一个空集合,进入循环体内部,如果其值为1,返回True
  3. 如果这个值不为1,首先看看这个值在不在创建的集合中,如果在就输出False,陷入死循环了,否则就将这个输出值加入到所创建的集合中
class Solution:def isHappy(self, n: int) -> bool:record = set()while True:n = self.get_sum(n)if  n==1:return Trueif n in record:return Falseelse:record.add(n)def get_sum(self,n: int) -> int:new_num =0while n:n,r = divmod(n,10)new_num +=r**2return new_num 

3.2 数组的思路

这种方法的精髓就在于将这个数字转换成字符串,然后在循环内部对其进行相乘,判断其值是否符合要求

class Solution:def isHappy(self, n: int) -> bool:record = []while n not in record:record.append(n)new_sum = 0n_str = str(n)for i in n_str:new_sum += int(i)**2if new_sum == 1: return Trueelse:n = new_sumreturn False

3.3 本题小结

  1. 计算一个数字的整数部分和余数部分,在python中可以使用divmod函数,例如m,n=divmod(23,10),那么m=2,n=3,这个就是计算方法
  2. 其他的需要注意就是将已经算出的新的sum值进行增加到列表或者集合中,如果在里面出现了相同的值,可以判断出这个代码已经死循环,则可以结束了

4. leetcode 1.两数之和

题目链接:349. 两个数组的交集 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili

自己的思路:首先就是对nums进行循环,然后再使用第二层循环从第一层循环的后面开始走,如果找到了一个i+j的数与目标值相等,则输出这个值即可

4.1 第一次写的代码

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i in range(len(nums)):for j in range(i+1,len(nums)):if nums[i]+nums[j] ==target:return [i,j]

4.2 哈希表的写法

思路

  1. 这道题返回的是值的下标,即索引位置,所以就想到了每个值对应一个下标,即键值对的对应关系
  2. 键值对就使用字典的方式,返回值为字典中的值
  3. 那么就对nums进行一个循环,循环包含其值和下标,所以使用enumerate函数,这样循环过程有两个数,下标和值本身
  4. 判断所需要两个值是否在里面呢,就需要进行一个计算,已知target的值,所以减去现在索引处的值,看得到的那个值在不在字典中,在就返回这两个的索引值
  5. 否则就将这个数值和索引值加到字典中
4.2.1字典的方法
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:recorde = dict()for index,value in enumerate(nums):if target-value in recorde:return [recorde[target-value],index]recorde[value] = indexreturn []               
4.2.2 集合的方法

这个方法有点绕,就是找值对应的索引,所以需要用到index函数。

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:recorde = set()for i,value in enumerate(nums):complement = target-valueif complement in recorde:return [nums.index(complement),i]recorde.add(value)return []               

4.3 本题小结

  1. 这道题主要掌握的思路就是字典的查询,明白这里面存储的值是什么值,一般情况下其内部所存储的值为键和值
  2. 为什么这道题索引为值,数值为键:因为我们要进行计算,判断过程就是看键在不在这个字典中,如果在的话再返回键所对应的值,所以这么选择

5 本章小结

5.1 选择哈希表的方法

  1. 哈希表一般出现在列表集合和字典中,就是对值和索引有要求的时候是较好用的一种方法
  2. 列表:选择这个的时候,是因为其数据内部的长度较短,不会报索引太长的时候用这种方法最简单,一般就是比较一个数组中的数是不是在另一个数组,有多少在里面的情况
  3. 集合:选择集合就是真内部需要存储的数据足够的长,而且要求内部不重复的话会很好用
  4. 字典:这个时候就是即需要对值和下标都有判断的时候,就比较好用,例如两数之和的题目,对键进行判断其值,返回的是其所对应的值

5.2 python中的一些函数

  1. 计算一个值的整数和余数部分的方法r,n=divmod(23,10),这个就是计算23/10的整数和余数,r=2,n=3
  2. 计算一个值的ASCII码的函数ord(a)是计算ASCII中的数值
  3. 在集合中添加数组方式set().add(1)就是将1添加到集合中
  4. 两集合的交集的求法set(a) & set(b)
  5. 对字典添加数据的方法num = dict(), num[key]=val
  6. 索引数组中值对应的下标num.index[1]就是索引数值1在列表中的索引位置

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

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

相关文章

IIC通讯协议笔记

iic通讯协议片上外设iic主发送器主发送器通讯过程 发送开始位后等待EVT5,发送从机(slave)地址等待EVT6和发送要写入从机的寄存器等待EVT8,发送数据等待EVT8_2片上外设主接收器发送过程接收过程

【C#】【DevExpress】自定义单元格右键菜单,去除单元格编辑时,载入系统的默认菜单

使用GridView,自定义单元格的右击菜单,可以通过监听事件PopupMenuShowing,实现新增菜单。1 private void gridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)2 {3 GridView view = sender as GridView;4 if (v…

2024年游戏买量应该怎么玩?

App中运行小游戏的技术价值和业务价值都是显著的:通过小程序容器技术,承载多样化的小游戏运行在自有App内,实现跨平台的游戏资源共享,降低买量成本,此为「降本」。进一步的,在App内快速引入多小游戏应用,为用户提供多样化的内容,以提升App内用户体验和留存率,增强用户…

JAVA基础之十-不常用但是又希望能看懂的关键字/保留字

对于绝大部分JAVA工程师而言,大部分的关键字也是能够看懂的,但还是相当一部分比较不常见的关键字,妨碍了代码阅读。 本文力图收集一些个人认为在CRUD机械工作中可能比较少见的一些关键字/保留字。 此类关键字主要用于修饰方法和类。 收集过程会持续一段时间,现在暂时没有时间…

django admin 后台中添加自定义的 html 页面

实现效果配置 简历模板html 文件{% extends "admin/base_site.html" %}{% block content %} <h1>自定义 HTML 页面</h1> <p>{{ your_variable }}</p> {% endblock %}admin 中添加代码, 主要是 get_urls 以及 对应的的视图from django.urls i…

国内外开源项目管理工具软件有哪些

不错的开源项目管理工具软件有:1. Redmine;2. Taiga;3. OpenProject;4. Tuleap;5. Odoo Project。比如Redmine是一款受到广大用户赞誉的开源项目管理工具,已被像GitHub、NASA和CERN这样的知名客户所采用。其核心能力在于灵活的问题跟踪和多项目管理。开源项目管理软件特别…

018 姓名案例

这么写有点小问题,效率不高,我们考虑计算属性来做

malloc底层实现以及和new的比较

背景: 前几天去面试,被问到了一个问题:“malloc的底层实现是怎样的? 怎样防止内存碎片?” 当时答的不够好,现在再整理一下。 (本文档通过收集整理网上博客而来。先挖个坑,等有时间了去看一下《深入理解操作系统》的第九章虚拟内存,再重新整理一篇) 内存布局 Linux中每…