代码随想录算法训练营第六天 | 242.有效的字母异位词 ,349. 两个数组的交集 , 202. 快乐数 ,1. 两数之和

代码随想录算法训练营第六天 | 242.有效的字母异位词 ,349. 两个数组的交集 , 202. 快乐数 ,1. 两数之和

LeetCode 242-有效的字母异位词

题目:

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

示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false

题目链接:
242-有效的字母异位词

思路:
可以设置一个26位的数组,因为字符a到z的ASCII码为连续的数值, 数组的下标可以为当前字母的ASCII码值减去字母"a"的ASCII码。若字符串s中,每个字母出现一次则加1,在字符串t中,每个字母出现一次则减1。只要最终数组不为0,就不是有效的字母异味词。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        record = [0] * 26
        for i in s:
            record[ord(i) - ord("a")] += 1
        for i in t:
            record[ord(i) - ord("a")] -= 1
        for i in range(26):
            if record[i] != 0:
                return False
        return True

LeetCode 349-两个数组的交集

题目:
在这里插入图片描述
题目链接:349-两个数组的交集

思路:
使用字典储存nums1数组出现过的数字,在遍历nums2数组,若当前数字在字典中,且之前没有出现过的就用ans数组储存该数字。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        val_dict = {} #以字典的形式储存
        ans = []
        for num in nums1:
            val_dict[num] = 1
        
        for num in nums2:
            if num in val_dict.keys() and val_dict[num] == 1:
                ans.append(num)
                val_dict[num] = 0 #防止重复出现的数字被重复加到结果里面

        return ans

拓展:

LeetCode 350-两个数组的交集 II

题目:

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

思路:
与上题的不同之处在于,这次要求每个元素出现的次数(取出现次数的最小值),因此元素的每次出现都要记录下来。

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        val_dict = {}
        ans = []

        for num in nums1:
            if num not in val_dict.keys():
                val_dict[num] = 1
            else: #记录数组nums1重复出现的数字个数
                val_dict[num] += 1
            
        for num in nums2:            
            if num in val_dict.keys() and val_dict[num] >= 1:
                ans.append(num)
                val_dict[num] -= 1
        
        return ans

LeetCode 202-快乐数

题目:
在这里插入图片描述

题目链接:
202-快乐数

思路:
设置好本题的循环终止条件比较关键。使用set()函数的特点是不可添加重复的元素,我们可以把出现过的数字和用set()函数储存起来,如果该数字和已经出现过了,就终止循环。
此外,由于我们不太清楚数字和的数字位数,因此我们需要从个位数开始实现平方数的逐位相加。

class Solution:
    def isHappy(self, n: int) -> bool:
        def happySum(n):
            sum = 0
            while n:  #从个位开始平方后相加
                sum += (n % 10) ** 2
                n = n // 10
            return sum

        record = set()

        while True:
            n = happySum(n)
            if n == 1:
                return True
            
            if n in record: #若再次出现已经出现过的数字平方和,则判断为循环,返回false
                return False
            else:
                record.add(n)

LeetCode 1-两数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

题目链接:
1-两数之和

思路:
使用enumerate(sequence, [start=0])函数。先把出现过的元素储存起来, 然后将目标值减去当前数,在查看字典中是否有相同的数字。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        records = dict()
        #使用enumerate(sequence, [start=0])函数

        for index, value in enumerate(nums):
            if target - value in records:
                return [records[target - value], index]
            records[value] = index #在没找到符合条件要求相加的整数时,先把该数字添加进字典里面,且该数字所在数组的下标为key

        return []

总结:
感觉自己懂了又好像没懂。就是python写起来感觉要简单很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值