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