学习目标:
- 掌握哈希表理论基础
- 242有效的字母异位词
- 349两个数组的交集
- 202快乐数
- 1两数之和
- 收获
学习内容:
有效的字母异位词
用哈希表map做,即python中字典结构;使用key value来存放对应元素(已查询完,且不属于待查询对象元素)及其下标
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
#python中字典对应着哈希表的map,这里要查询一个字符是否属于map中,这里使用字典结构
res = dict()
for index, n in enumerate(nums):
if target - n in res:
return list([index, res[target-n]])
else:
res[n] = res.get(n, index)
- 为什么会想到用哈希表
- 哈希表为什么用map
- 本题map是用来存什么的
- map中的key和value用来存什么的
class Solution:
# 解法一:(自己写)
# def sum(self, n: int) -> int:
# sums = 0
# while n != 0:
# sums += (n % 10) * (n % 10)
# n = n // 10
# return sums
def isHappy(self, n: int) -> bool:
# table = {}
# 报错int不能迭代,因为def sum(n):写成def sum(self, n: int) -> int:
## sums = sum(n)
# sums = self.sum(n)
# while sums != 1:
# table[sums] = table.get(sums, 0) + 1
# n = sums
# sums = self.sum(n)
# # 防止陷入死循环
# lists = list(table.values())
# if 2 in lists:
# return False
# # lists = list(table.values())
# # for i in lists:
# # if i > 1:
# # return False
# return True
# 集合(看的答案)
# 注意这里元素和计算出来之后需要更新n
record = set()
while True:
nums = self.get_sum(n)
n = nums
if nums == 1:
return True
if nums in record:
return False
else:
record.add(nums)
def get_sum(self, n: int) -> int:
num = 0
while n:
# 商,余数 = divmod(被除数,除数)
n, r = divmod(n, 10)
num += r * r
return num
349两个数组的交集
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# # 鼓捣半天以为python中的哈希表是有专门的调用函数,
# table = {}
# for i in nums1:
# 掌握一个字典赋值初始化的方法
# table[i] = table.get(i, 0) + 1
# res = set()
# for num in nums2:
# if num in table:
# res.add(num)
# del table[num]
# return list(res)
# 解法二 感觉好简便
return list(set(nums1) & set(nums2))
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母-
class Solution: def isAnagram(self, s: str, t: str) -> bool: # # 朴实无华的使用字典记录一个字符串的每一个元素的出现次数 # dicts = {} # # 这步是字典的初始化,不然记录不了 # for i in s: # dicts[i] = 0 # for i in s: # dicts[i] += 1 # for key in dicts.keys(): # count = 0 # for j in t: # if j == key: # count += 1 # if count != dicts[key]: # return False # return True # 下面是使用哈希表方法做的 record = [0]*26 for i in s: record[ord(i) - ord("a")] += 1 for j in t: # TypeError: 'builtin_function_or_method' object is not subscriptable # record[ord[j] - ord("a")] -= 1 record[ord(j) - ord("a")] -= 1 for q in range(26): if record[q] != 0: return False return True
收获:
-
divmod(被除数,除数)函数,返回一个包含商和余数的元组(a//b, a%b);
只能接受整数或浮点数类型的参数
divmod函数的返回值类型是元组
python 字典get函数
利用键获取值
dict[key]
dict.get(key)
利用get()函数操作时当字典中不存在输入的键时会返回一个None,这样程序运行时就不会出异常
利用字典统计列表中元素出现次数:
cou[i]=cou.get(i,0)+1 #之后称其为get的赋值语句,目的是新建字典键值对;该语句连续运行两次,每次的结果都不一样;
第一次是此时get语句的功能为赋初值,即把键’aa’的初值置为0然后加1;
第二次:cou[i]=cou.get(i,0)+1(i=‘aa’);因get语句已经作为赋值语句出现过一次了,因此此时再执行这条语句时,赋值功能已经无效了,也就是get语句里第二个参数对’aa’这个键已经无效了,此时get语句的功能为文章内的第一大部分所介绍的功能,所以这条语句此时可等价为
cou[i]=cou.get(i)+1
以列表返回字典中的所有值:values()方法:
scores_dict = {'语文': 105, '数学': 140, '英语': 120}
print(scores_dict.values()) # 输出 dict_values([105, 140, 120])
字典初始化:
dict();
字典同时遍历key和value:
#function1
for key,value in dict.items():
print ('key: ',key,'value: ',value)
------------------------
key: 小明 value: 129
key: 小兰 value: 148
key: 小红 value: 89
#function2
for (key,value) in dict.items():
print ('key: ',key,'value: ',value)
------------------------
key: 小明 value: 129
key: 小兰 value: 148
key: 小红 value: 89
#function3
for kv in dict.items():
print ('kv is : ',kv)
------------------------
kv is : ('小明', 129)
kv is : ('小兰', 148)
kv is : ('小红', 89)
----------------------结合zip使用---------------------
#function4
for key,value in zip(dict.keys(), dict.values()):
print ('key:',key,'value: ',value)
print('type key:',type(key),'type value:',type(value))
------------------------
key: 小明 value: 129
type key: <class 'str'> type value: <class 'int'>
key: 小兰 value: 148
type key: <class 'str'> type value: <class 'int'>
key: 小红 value: 89
type key: <class 'str'> type value: <class 'int'>
#function5
for kv in zip(dict.keys(), dict.values()):
print ('kv: ',kv)
print('type:',type(kv))
------------------------
kv: ('小明', 129)
type: <class 'tuple'>
kv: ('小兰', 148)
type: <class 'tuple'>
kv: ('小红', 89)
type: <class 'tuple'>
集合:
类别代码随想录中的哈希数据结构,简单记录一下自己的学习心得
定义及特点:python中set是一个无序不重复的序列,set的主要作用是用来给数据去重。集合的定义方式:sets = set('s', 'q', 1, 3, 5)或者sets = {'s', 'q', 1, 3, 5} ;注意若是定义一个空集合必须使用set()而不是{},因为{}是用来表示空字典类型的;
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
- 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
集合使用:创建及初始化;增删查改;
定义及初始化
# 使用{}进行初始化定义(非空集合),存贮会自动去重
q = {}
# 空集合用set()函数表示
q = set()
# 使用set()创建集合,即可以自动将其他数据结构转化成集合
q = set(("hello","jerry",133,11,133,"jerru")) #只能传入一个参数,可以是list,tuple等 类型
print(len(q))
print(q)
'''
输出:
5
{133, 'jerry', 11, 'jerru', 'hello'}
增删查改:
person.add("student") #如果元素已经存在,则不报错,也不会添加,不会将字符串拆分成多个元素,去别update
person.update("abc") #可以使用update添加一些元组列表,字典等。但不能是字符串,否则会拆分,#会将字符串拆分成a,b,c三个元素
person.remove("student")#按元素去删除,如果不存在 ,会报错
person.discard("student")#功能和remove一样,好处是没有的话,不会报错
#4.查询是否存在,无法返回索引,使用in判断
if "teacher" in person:
print("true")
学习时间:
这次花费的时间有点长两天?三天?
学习产出:
python哈希表主要说的是set()和字典dict()