目录
Leetcode 242
题目:有效字母异位数
学习资料:代码随想录
初始思路:
- 利用一个dict字典来存储s字符串,并且记录字符出现个数,遍历t字符串,查找字典,找到对应key后,value减一,如果字符都没有出现直接返回False;最后需要判断字典的value是否都为0,如果有一个不为0,则说明不一样,返回False
学习后:
- 利用ASCII码,用一个list来存储每个字母出现的次数,然后再遍历减去,再检查是否存在不为0的;利用ASCII码非常有效
- 直接建立两个字典,然后对比两个字典是否一样,空间复杂度稍微高一点
实现过程
思路一
def isAnagram(self, s: str, t: str) -> bool:
save = dict()
if len(s) != len(t):
return False
for char in s:
if char not in save:
save[char] = 1
else:
save[char] +=1
for char in t:
if char not in save:
return False
else:
save[char] -= 1
for i in save:
if save.get(i) != 0:
return False
return True
思路二:
s_dic = dict()
t_dic = dict()
for char in s:
if char not in s_dic:
s_dic[char] = 1
else:
s_dic[char] += 1
for char in t:
if char not in t_dic:
t_dic[char] = 1
else:
t_dic[char] += 1
return s_dic == t_dic
思路三:
c = [0] * 26
for i in s:
c[ord(i)-ord("a")] += 1
for i in t:
c[ord(i)-ord("a")] -= 1
for i in c:
if i !=0:
return False
return True
Leetcode349
题目:数组交集
学习资料:代码随想录
思路:
- 利用set求交集,python中set可以利用逻辑运算符计算
实现过程:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
Leetcode 202
题目:快乐数
学习资料:代码随想录
初始思路
- 求和,添加到set里面查看是否有重复
- 注意按位数计算
学习后
- 思路基本
def isHappy(self, n: int) -> bool:
record = set()
while True:
n = self.calculateSUm(n)
if n == 1:
return True
if n not in record:
record.add(n)
else:
return False
def calculateSUm(self, nums):
sum_ = 0
while nums:
sum_ += (nums % 10)**2
nums = nums // 10
return sum_
Leetcode 1
题目:两数之和
学习资料:代码随想录
初始思路
- 写过太多次了,之前也有博客
学习后
- 逻辑更加清楚,有理有据的阐述为什么选择dict而不是set
def twoSum(self, nums: List[int], target: int) -> List[int]:
re = dict()
for i in range(len(nums)):
if target - nums[i] in re:
return [re[target - nums[i]], i]
re[nums[i]] = i
总结
- 分清楚,什么时候需要用到hash的思想,一般是想要判断一个元素是否出现在集合中时使用
- 分清楚什么时候,用set和dict