【代码随想录| 哈希表 242.有效字母异位词、349.两个数组的交集、两数之和】


python

一、哈希表理论基础

快速判断一个元素是否出现在集合中

二、242.有效字母异位词

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]

总结

输入输出

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值