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

119 阅读5分钟

242. 有效的字母异位词 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

首先判断st两个字符串是否等长:

  1. 不等长就返回False.
  2. 等长再往下看。

创建一个hash表,这个hash表统计字符串s中各个字符的个数。

当遍历另一个字符出t时,每遇到一个字符,我们就判断这个字符在不在hash_table中。

  1. 如果在这个hash_table中,检查它的对应值,如果为0,说明这个字符已经用尽了,直接return False,如果为正数,我们就可以给它对应的值-1.
  2. 如果不在这个hash_table中,我们就可以直接返回False.

如果整个遍历过程中没有return False,那我觉得是可以return True了。

3. 实现过程中遇到的困难

  1. 我不知道字符串的长度怎么求,直接用len(s)吗?yes!
  2. 遍历字符串中的每一个字符?直接用for就可以。
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t):
            return False
        else:
            hash_dict = dict()
            for s_char in s:
                if s_char in hash_dict.keys():
                    hash_dict[s_char] += 1
                else:
                    hash_dict[s_char] = 1
            for t_char in t:
                if t_char in hash_dict.keys():
                    if hash_dict[t_char] <= 0:
                        return False
                    else:
                        hash_dict[t_char] -= 1
                else:
                    return False
        return True

4. 看完代码随想录之后的想法

直接用数组即可。索引是char - 'a'

5. 学习时长

三十分钟。

349. 两个数组的交集 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

数组nums1中所有的字符统计在一个set1中。

遍历nums2中的每一个字符char:

  1. 如果charset1中,那就把它加入到最后的结果集合res_set中。
  2. 否则,跳过。

最后返回res_set即可。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set1 = set()
        for num in nums1:
            set1.add(num)
        print(set1)
        res_set = set()
        for num in nums2:
            if num in set1:
                res_set.add(num)
        return list(res_set)

3. 实现过程中遇到的困难

熟悉集合的基本操作:

在 Python 中,set 是一种无序、不重复的集合数据类型,它支持基本的数学运算,例如交集、并集、差集等操作。下面是一些常见的 set 操作:

  1. 创建一个 set

    my_set = {1, 2, 3, 4, 5}
    
  2. 添加元素:

    my_set.add(6)  # 添加单个元素
    my_set.update({7, 8, 9})  # 添加多个元素
    
  3. 删除元素:

    my_set.remove(5)  # 删除指定元素
    my_set.discard(10)  # 删除指定元素(如果存在)
    my_set.pop()  # 删除任意一个元素
    my_set.clear()  # 删除所有元素
    
  4. 集合运算:

    set1 = {1, 2, 3, 4, 5}
    set2 = {4, 5, 6, 7, 8}
    
    union_set = set1.union(set2)  # 并集
    intersection_set = set1.intersection(set2)  # 交集
    difference_set = set1.difference(set2)  # 差集
    symmetric_difference_set = set1.symmetric_difference(set2)  # 对称差集
    

    在上面的例子中,set1set2 分别是两个集合。union_set 是这两个集合的并集,intersection_set 是它们的交集,difference_setset1 相对于 set2 的差集(即包含在 set1 中但不包含在 set2 中的元素),symmetric_difference_set 是两个集合的对称差集(即只包含在其中一个集合中的元素)。

  5. 判断元素是否在集合中:

    my_set = {1, 2, 3, 4, 5}
    if 3 in my_set:
        print("3 is in the set")
    if 6 not in my_set:
        print("6 is not in the set")
    

    在上面的例子中,使用 innot in 操作符可以判断一个元素是否在集合中。

另外最后一定要检查一下返回的类型是什么,set需要转为list才能返回。

4. 看完代码随想录之后的想法

使用数组来做哈希的题目,是因为题目都限制了数值的大小。

而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

5. 学习时长

20分钟。

202. 快乐数 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

根据题目文字理解,任何一个数如果不是快乐数那一定会陷入循环。 所以我们只需要记录一个周期总共有多少种数字,如果有一个各位平方后求和得到结果出现在了此前收集周期的set中,那就说明一定不是快乐数。

class Solution:
    def isHappy(self, n: int) -> bool:
        set_n = set()
        while True:
            if n == 1:
                return True
            else:
                sum_int = 0
                while n:
                    bit = n % 10
                    n = n // 10
                    sum_int += (bit * bit)
                n = sum_int
                if n in set_n:
                    return False
                else:
                    set_n.add(n)
        return False

3. 实现过程中遇到的困难

除法一定要用取整的方法,而不是直接除,不然会被转为浮点数。

4. 看完代码随想录之后的想法

思路基本一致。

5. 学习时长

26分钟。

1. 两数之和 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

一开始我想的是两两自由组合得到的结果 与target进行比较,相等就返回对应的两个数的角标。 但是我觉得这样做其实是一个O(n2)O(n^2)的时间复杂度。

这个对于length=104length=10^4有点夸张了。

于是我想到了另一个方法: 搞一个字典,键是数组中出现的数字,value是数组中数字出现的次数。 我们遍历字典的所有键,用target-key如果还在字典中,且字典中这个数字出现的次数还不为0,那就可以直接得知两个数分别是什么。 然后通过两个for循环找到这两个值的位置。

3. 看完代码随想录之后的想法

因为是两数之和中的两个数,不是多个数,我们不必考虑万一我们从一个map中要存两个相等元素的不同下标这个问题。 如果真的找到了两个相等元素求和得到target,那一定是一个在map中,另一个就是target减去的那个数。 所以我们的这个map就存的是{数组元素:在数组的索引}

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        num_idx_dict = dict()
        num_idx = 0
        for num in nums:
            if target - num in num_idx_dict.keys():
                return [num_idx, num_idx_dict[target - num]]
            else:
                num_idx_dict[num] = num_idx
            num_idx += 1

4. 实现过程中遇到的困难

就是第一想法想不到字典用来存的是一个数组每个元素和它在数组中的位置组成的键值对。

5. 学习时长

35分钟