hash:
什么时候用想到hash:当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了
常用的hash数据结构:数据(数值不大用),set,map
python中ord("字符")获取编码值
242.有效的字母异位词
解题关键1:
两个字符串比较,共三个循环
一个循环:统计一个字符个数,放在对应的数组(理解为hash)中。
一个循环,重新遍历,将第一个数组中采集的个数一一减掉。
一个循环,判断这个数组中是否全为0
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0]*26
for i in s:
record[ord(i)-ord('a')]+=1
for i in t:
record[ord(i)-ord('a')]-=1
for i in range(26):
if record[i]!=0:
return False
return True
349. 两个数组的交集
采用python内置的set来做
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1)&set(nums2))
采用dict与set结合的方式做
202. 快乐数
解题关键:
如果形成循环,那个结果中必然存在相同的数据,此题则转化为判断一个元素是否出现在集合中。采用数组的方法计算
需要注意的点为,进入while循环后,则将n添加进记录中。不能在最后添加,否则会失去添加本身,造成无限循环。
class Solution:
def isHappy(self, n: int) -> bool:
record = []
while n not in record:
record.append(n)
str_n = str(n)
sum_str=0
for i in str_n:
sum_str += int(i)**2
if sum_str == 1:
return True
else:
n = sum_str
return False
1. 两数之和
hash方法计算:
一个集合存放已经遍历的数据
一个map存放最终结果。
暴力法:
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]