代码随想录| 哈希表 242.有效字母异位词、349.两个数组的交集、两数之和
python
一、哈希表理论基础
快速判断一个元素是否出现在集合中
二、242.有效字母异位词
1.核心代码
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0] * 26
for i in s:
#并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
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:
#record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return False
return True
ord(i) 是 Python 中的一个内置函数,它接收一个字符(长度为 1 的字符串)作为参数,并返回该字符在 ASCII 表中或 Unicode 码点中的数值。例如,如果 i 是字母 ‘a’,ord(i) 会返回 97,因为 ‘a’ 在 ASCII 表中对应的数字就是 97。
class Solution(object):
def isAnagram(self, s: str, t: str) -> bool:
from collections import Counter
a_count = Counter(s)
b_count = Counter(t)
return a_count == b_count
2.开始学调试
pycharm调试
设置断点,然后步入自己写的函数调试
3.输入输出
def isAnagram(s:str,t:str)->bool:
from collections import Counter
a_count = Counter(s)
b_count = Counter(t)
return a_count==b_count
if __name__=="__main__":
#输入
s=input("请输入t:").strip('"')
t=input().strip('"')
result=isAnagram(s,t)
print(result)
字符串只要去除“”就可以了,用strip去掉,输入输出其实很简单
二、349.两个数组的交集
1、核心代码
我还想着这两个没办法+1 -1 =0来区分都出现的,但是其实就第一个数组提出一个组合,对这个数组遍历再把第二个也出现的放到新的集合中就可以了!
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 使用哈希表存储一个数组中的所有元素
table = {}
for num in nums1:
table[num] = table.get(num, 0) + 1
# 使用集合存储结果
res = set()
for num in nums2:
if num in table:
res.add(num)
del table[num]
return list(res)
在Python中,table = {}这行代码表示创建了一个空字典。字典是Python中一个非常灵活的内置数据类型,它可以存储任何数量的Python对象或值,每个对象或值都与一个唯一的键相关联。在这个空字典中,你可以添加键值对,其中键可以是任何不可变的数据类型,如字符串、数字或元组,而值可以是任何Python对象。
这是在字典中添加键值对的一个例子:
table = {} # 创建一个空的字典
table[‘apple’] = ‘fruit’ # 向字典中添加一个键值对,‘apple’ 是键,‘fruit’ 是与之关联的值
table[42] = ‘answer’ # 添加另一个键值对,42 是键,‘answer’ 是与之关联的值
table.get(num, 0):这是在 table 字典上调用 get 方法,它接受两个参数。num 是我们要在字典中查找的键,0 是当键不存在时返回的默认值。所以,如果 num 不是字典中的一个键,那么这个方法会返回 0。
if num in table:查的是table对应的键值
当您看到 res = set() 这行代码时,它说明在代码中创建了一个新的空集合,并将其赋值给变量 res。
在 Python 中,set 是一种基本的数据结构,它有几个特性:
集合中的元素是唯一的,它会自动去除重复的元素。
集合中的元素是无序的,你不能通过索引位置获取元素。
集合可以进行数学上的集合操作,比如并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference)。
举例来说,如果你想添加一些元素到这个新创建的集合 res 中,你可以使用 add() 方法或者 update() 方法。
自己用两个集合写的
class Solution:
def intersection(self,nums1,nums2):
res=set()
for num in nums1:
res.add(num)
result=set()
for num in nums2:
if num in res:
result.add(num)
return list(result)
2、输入输出
def intersection(nums1,nums2):
res=set()
for num in nums1:
res.add(num)
result=set()
for num in nums2:
if num in res:
result.add(num)
return list(result)
if __name__=="__main__":
input_nums1=input()
input_nums1 = input_nums1[input_nums1.find('[')+1:input_nums1.find(']')]
nums1=list(map(int,input_nums1.strip().split(',')))
input_nums2=input()
input_nums2 = input_nums2[input_nums2.find('[')+1:input_nums2.find(']')]
nums2=list(map(int,input_nums2.strip().split(',')))
result=intersection(nums1,nums2)
print(result)
三、两数之和
我的想法是双for循环,我没有想到的点是,把已知和和一个数,转化为求差值,就等于另一个数
1、核心代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records = dict()
for index, value in enumerate(nums):
if target - value in records: # 遍历当前元素,并在map中寻找是否有匹配的key
return [records[target- value], index]
records[value] = index # 如果没找到匹配对,就把访问过的元素和下标加入到map中
return []
for index, value in enumerate(nums):
这行代码是 Python 中的一个循环语句,它使用 enumerate 函数来遍历列表 nums。
enumerate(nums) 会生成一个枚举对象,包含列表 nums 中每个元素的索引和值。每次循环迭代时,enumerate 会返回一个元组 (index, value),其中 index 是当前遍历到的元素的索引,value 是该索引位置上的元素的值
方法二:集合
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
#创建一个集合来存储我们目前看到的数字
seen = set()
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [nums.index(complement), i]
seen.add(num)
只知道数组的值,而不知道索引:nums.index(val)
如果用户输入的是一个字符串,类似于 “[2,7,11,15]”,你可以使用 Python 的 json 模块或者 ast 模块来安全地将这个字符串转换成一个数组变量。以下是使用这两种模块的示例:
使用 json 模块:
python
import json
假设 input_str 是用户输入的字符串
input_str = “[2,7,11,15]”
使用 json.loads 将字符串转换为列表
numbers = json.loads(input_str)
print(numbers) # 输出: [2, 7, 11, 15]
总结
输入输出