2022-12-12Day6 |242.有效的字母异位词 | 1. 两数之和 202. 快乐数 349. 两个数组的交集

242.有效的字母异位词

题目链接:

242. 有效的字母异位词 - 力扣(Leetcode)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

收获的点:

1) python的collections模块:
collections模块实现了特定的数据容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。
这篇((54条消息) Python模块-collections_红鲤鱼与绿驴的博客-CSDN博客
)写的特别完整
以Counter函数为例
Counter是dict的一个子类,用于对可哈希对象进行计数。

from collections import Counter

a = Counter(['a', 'b', 'c', 'a', 'b', 'a'])  # 使用列表初始化计数器
b = Counter(('a', 'b', 'c', 'a', 'b', 'a'))  # 使用元组初始化计数器
c = Counter("Hello")  # 使用字符串初始化计数器
d = Counter({'a': 3, 'b': 2, 'c': 1})  # 使用字典手动地告诉计数器的值

e = Counter(a=3, b=2, c=1)  # 使用关键字参数

print(a)
print(b)
print(c)
print(d)
print(e)

# 输出
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1})
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'a': 3, 'b': 2, 'c': 1})

更新计数

from collections import Counter

a = Counter("Hello")
a.update({'e': 2, 'o': 4})  # 更新计数器
b = a.most_common(2)  # 取出频率最高的2个值

print(a)
print(a['e'])  # 访问计数器
print(b)
for i in "Hello":
    print(i, a[i])

# 输出
Counter({'o': 5, 'e': 3, 'l': 2, 'H': 1})
3
[('o', 5), ('e', 3)]
H 1
e 3
l 2
l 2
o 5

明白Counter函数以后这个题目的答案就非常容易了:

完整代码:

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        #思路:将s和t转化为两个字典,字典的key是元素,value是元素出现的次数。如果两个字典的key,value相等,返回就是字母异位词。
        s1 = Counter(s)
        t1 = Counter(t)
        return s1 == t1

349. 两个数组的交集

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

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

收获的点:

1.&符号为取交集,相当于intersection

return [set(nums1) & set(nums2)]
return [set(nums1).intersection(set(nums2)]

2.善用列表解析式

return [ i for i in set(nums1) and i in set(nums2)]

解题代码:

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        s1 = len(nums1)
        s2 = len(nums1)
        if s1< s2:
            nums1 = nums2
            s1 = s2
        #让s1为更长的数组
        res = []
        for i in nums1:
            if i in nums2 and i not in res:
                res.append(i)
        return res

202. 快乐数

题目链接:

代码随想录 (programmercarl.com)
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

image.png

有想到中间进行判断,并且用while,但是while 条件是 != 1这个点当时没考虑清楚。喜欢这种有意思的题。

完整代码:

class Solution:
    def isHappy(self, n: int) -> bool:
        pre = set([n])
        def check(nums):
            lst = [ int(val) **2 for val in str(nums)]
            return sum(lst)
        while n != 1:
            n = check(n)
            if n in pre:
                return False
            pre.add(n)
        return True

1 两数之和

题目链接:

1. 两数之和 - 力扣(Leetcode)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

最终还是想到最初用的两层for循环,不过这次能很快想清楚里面的逻辑。

完整代码:

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]

一个更好的解法:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = {}
        for i,num in enumerate(nums):
            hashtable[num] = i 

        for j, x in enumerate(nums):
            i = hashtable.get(target-x)
            if i != None and i != j:
                return [j,i]

先建立字典,再查询字典,使用了字典查询dict.get(x)返回索引

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容