题目和思路:
一、242.有效的字母异位词
Day2时候做水果成篮已经使用过哈希表,想起来应用上次学到的写法:
dict[key] = dict.get(key,0)+1
方法一:本题思路比较清晰,根据s建字典,再遍历t,跟哈希表进行比较,遇到相同字符字典对应键的值-1,直到变成0,删除该键;遇到不在表内的字符,return False;循环结束后还需要判断字典是否为空,空字典返回True说明一模一样,否则返回False。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
s_dict = {}
for _ in s:
s_dict[_] = s_dict.get(_, 0) + 1
for character in t:
if character not in s_dict:
return False
else:
s_dict[character] -= 1
if s_dict[character] == 0: del s_dict[character]
if s_dict:
return False
else:
return True
方法二:其实python有自己的开挂方式——collections库...
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
from collections import Counter
s_dict = Counter(s)
t_dict = Counter(t)
return s_dict == t_dict
方法三:使用数组作为哈希表(参考代码随想录):
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dd = [0 for _ in range(26)]
if len(s) != len(t): return False
else:
for i in range(len(s)):
dd[ord(s[i]) - ord('a')] += 1
dd[ord(t[i]) - ord('a')] -= 1
return not any(dd)
二、349. 两个数组的交集
其实python的set其实有点过于强大了,以至于...
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
还是装模作样写一下...
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
s1 = set()
res = set()
for _ in nums1:
s1.add(_)
for _ in nums2:
if _ in nums1:
res.add(_)
return list(res)
三、202. 快乐数
使用哈希表跳出死循环,如果n的当前值出现过第二次,意味着要死循环了,这时候使用哈希表可以轻松跳出死循环。代码如下:
class Solution:
def sqrSum(self, n):
cnt = 0
while n:
cnt += (n % 10) ** 2
n = n // 10
return cnt
def isHappy(self, n: int) -> bool:
loop_dict = set()
while n != 1:
if n not in loop_dict:
loop_dict.add(n)
else:
return False
n = self.sqrSum(n)
return True
代码随想录上有一个快慢指针实现的方法,用快慢指针来判断是否有“环”,也就是死循环,赞一下但是不写!
python有一个可以简化代码的pythonic写法:
n = sum(int(_) ** 2 for _ in str(n))
学!
四:有人相爱,有人夜里开车看海,有人力扣第一题写不出来(doge)1. 两数之和
n年前确实不会写,今天估计可以了!
使用字典做哈希表,key表示已经遇到的值,value表示值对应的下标。每一次迭代判断target减去当前值的差值,如果在字典内,则返回当前索引和查到的value,否则将当前值和索引写入字典。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
another = {}
for i,num in enumerate(nums):
if target - num in another:
return [another[target-num],i]
else:
another[num] = i
今日总结:
今天内容不算难,练习一下pythonic coding,可以在总计20行内解决今天的四个题目。