哈希表的数组实现
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
result = [0]*26
for i in s:
result[ord(i)-ord('a')]+=1
for i in t:
result[ord(i)-ord('a')]-=1
for i in result:
if i!=0:
return False
return True
ord():计算字符的哈希值
采用相对数值的方式,只需要建立长度为26的数组即可,初始值都赋为0(对于长度较小的情况一般采用数组的形式构建哈希表)
出现唯一值,一般考虑集合
集合常用操作:
1、集合的创建:
s = {1, 2, 3, 4, 5} # 使用花括号直接创建
s = set([1, 2, 3, 4, 5]) # 使用set()函数从列表或其他可迭代对象创建
2、添加元素:
s.add(6) # 添加单个元素
s.update([7, 8, 9]) # 添加多个元素,可以是列表、元组等可迭代对象
3、移除元素
s.remove(5) # 移除指定元素,如果元素不存在则抛出KeyError异常
s.discard(6) # 移除指定元素,如果元素不存在则不抛出异常
s.pop() # 随机移除一个元素并返回它,如果集合为空则抛出KeyError异常
s.clear() # 移除集合中的所有元素
4、集合的交集并集差集
s1 = {1, 2, 3, 4, 5}
s2 = {4, 5, 6, 7, 8}
intersection = s1 & s2 # 或 s1.intersection(s2)
union = s1 | s2 # 或 s1.union(s2)
diff = s1 - s2 # s1中有但s2中没有的元素
diff_reverse = s2 - s1 # s2中有但s1中没有的元素
symmetric_diff = s1 ^ s2 # s1或s2中有,但不同时存在的元素
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1)&set(nums2))
def intersect1(self, nums1: List[int], nums2: List[int]) -> List[int]:
a = [0]*1001
b = [0]*1001
c = []
for i in range(len(nums1)):
a[nums1[i]]+=1
for i in range(len(nums2)):
b[nums2[i]]+=1
for i in range(1001):
if a[i]*b[i]>0:
c.append(i)
return c
扩展:350. 两个数组的交集 II:返回全部重复的元素(不去重)
class Solution:
##双指针
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums1.sort()
nums2.sort()
result = []
a = b = 0
while a < len(nums1) and b < len(nums2):
if nums1[a] < nums2[b]:
a+=1
elif nums1[a] > nums2[b]:
b+=1
else:
result.append(nums1[a])
a+=1
b+=1
return result
##三个数组
def intersect1(self, nums1: List[int], nums2: List[int]) -> List[int]:
a = [0]*1001
b = [0]*1001
c = []
for i in range(len(nums1)):
a[nums1[i]]+=1
for i in range(len(nums2)):
b[nums2[i]]+=1
for i in range(1001):
if a[i]*b[i]>0:
for _ in range(min(a[i], b[i])):
c.append(i)
return c
class Solution:
##暴力解法双循环
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0,len(nums)):
for j in range(i+1,len(nums)):
if nums[j] == target-nums[i]:
return [i,j]
##集合
def twoSum1(self, nums: List[int], target: int) -> List[int]:
a = set()
for i,num in enumerate(nums):
b = target-num
if b in a:
return [nums.index(b),i]
a.add(num)
##字典
def twoSum2(self, nums: List[int], target: int) -> List[int]:
a = dict()
for i,num in enumerate(nums):
b = target-num
if b in a:
return [nums.index(b),i]
a[num] = b