242.有效的字母异位词
哈希表的三种数据结构:数组、set和map
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hash = [0]*26 #因为字符串只有26个字母,所以我们的映射只是26即可
# 对于第一个字符串统计出现的频率,第二个字符串减减,如果最后不是0则不一样
for i in s:
hash[ord(i) - ord("a")] +=1 #计算a-z是第几个的方式
for i in t:
hash[ord(i) - ord("a")] -=1
for i in range(26):
if hash[i] != 0:
return False
return True
defaultdict和counter也可以作为思路,下去可以再研究一下
349. 两个数组的交集
考虑用到哈希表的情况:一个元素是否在数组中出现过
C++中本题可能更倾向于用set:unordered set
思路:先遍历nums1记录出现的元素,然后在nums2验证是否出现过
字典中的get( )使用方法小结:
1.get()函数利用键来获取值 之前在学习python的时候,在获取值得时候常用的方法就是直接print(dict[key]),但这种方法中当字典中不存在该键时会返回KeyError类型错误,此时就可以用get()函数还利用键获取值
print(dict.get(key))利用get()函数操作时当字典中不存在输入的键时会返回一个None,这样程序运行时就不会出异常
2.利用字典统计列表中元素出现次数
ls=['aa','b','c','ddd','aa'] cou={} #创建一个空字典 for i in ls: cou[i]=cou.get(i,0)+1 #之后称其为get的赋值语句,目的是新建字典键值对 ''' 赋值语句代码效果等同于 cou[i]=0 # 对于i这个字符赋初值为0,但只是在第一次出现的时候执行cou[i]=cou.get(i,0)+1(i=‘aa’),第二次就相当于cou[i]=cou.get(i)+1 cou[i}=cou[i]+1 ''' print(cou)->{'aa': 2, 'b': 1, 'c': 1, 'ddd': 1}
get()函数在这里有两个参数,第一个是确定要分配值的键,第二个是拟定给键分配一个初值,但实际要给键赋值仍需要get赋值语句
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
table ={}
for i in nums1:
table[i] = table.get(i,0)+1
res = set() # 用set存储,不重复
for i in nums2:
if i in table:
res.add(i)
del table[i]
return list(res) # 注意最后return的是list
另一个版本,使用集合set更简单的做法:
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
202. 快乐数
分析:由于1 <= n <= 2^31 - 1
所以最大的9999999999→81*10 = 810
所以这意味着变一次之后这个数值大大减小了!从811之后就会开始循环,并且是一个圈,这就类似之前找环的入口那道题了,相当于这次知道环的入口但是我们要找一个相遇结果为1的点,如果相遇结果不为1那么就不是要找的
class Solution:
def isHappy(self, n: int) -> bool:
record = set()
while True:
# print(n)
if n in record: # 如果中间结果重复出现,说明陷入死循环了,该数不是快乐数
return False
if n == 1:
return True
else:
record.add(n)
n = self.cal_sum(n)
def cal_sum(self, n:int) -> int:
new_sum = 0
while n:
new_sum += (n%10)**2
n= n//10
return new_sum
1. 两数之和
在C++中,本题往往使用map:key,value这样可以存放两个数值,key是数的大小,value是数的位置;这里为什么key是数的大小是因为我们要找的是数值有没有出现过
map存放遍历过的元素,可以理解为类似python中的字典
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict = {}
for i in range(len(nums)):
if target - nums[i] not in dict:
dict[nums[i]] = i
else:
return [dict[target-nums[i]], i]