2025-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 。

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

有想到中间进行判断,并且用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)返回索引

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...