数据结构Day6 哈希表:242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表主要解决的问题:判断一个元素是不是在某个集合之中。

主要的表现形式:数组、集合、以及map形式

按照以前经验,应该是用python中的dict形式实现字典,实现map的格式形式,实现键值对应。

242.有效的字母异位词

用数组去构造一个哈希表固然很简单,注意一下ord函数的意义,

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        record = [0]*26
        for i in s:
            record[ord(i)-ord("a")] += 1
        for j in t:
            record[ord(j)-ord("a")] -= 1
        for k in record:
            if k != 0:
                return False
        return True
        

 构建一个字典储存哈希表的形式

注意怎么遍历,将元素建立成一个初始的哈希表!!!

本质上这两种方法应该是差不多的,后者可能更节省空间,而且更加灵活一些!

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        hashtable = dict()
        for i in s:
            if i not in hashtable.keys():
                hashtable[i] = 1
            else:
                hashtable[i] += 1
        for j in t:
            if j not in hashtable.keys():
                return False
            else:
                hashtable[j] -= 1
        for k in hashtable.values():
            if k != 0:
                return False
        return True

349. 两个数组的交集

还是按照上面的思路,建立哈希表之后,set进行去重,有一点讨巧!但是应该可以靠这种方法去a题。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        num = []
        hashtable = dict()
        for i in nums1:
            if i not in hashtable.keys():
                hashtable[i] = 1
        for j in nums2:
            if j in hashtable.keys():
                num.append(j)
        return list(set(num))

这道题的一个关键是怎么进行去重,建立一个函数,重复调用去储存键值,最后对比键是否是在另一个哈希表之中,即可!

但是应该空间有优化的地方,毕竟是占用了两个哈希表。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        num = []
        def hashtable(nums):
            hashtable = dict()
            for nums in nums:
                if nums not in hashtable.keys():
                    hashtable[nums] = 1
            return hashtable
        hashtable1,hashtable2 = hashtable(nums1),hashtable(nums2)
        for i in hashtable1.keys():
            if i in hashtable2.keys():
                num.append(i)
        return num

顺手把350两个数组的交集 II写了,其实思路差不多,只是多存储了一下出现的次数。

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        num = []
        def createhashtable(nums):
            hashtable = dict()
            for i in nums:
                if i not in hashtable.keys():
                    hashtable[i] = 1
                else:
                    hashtable[i] += 1
            return hashtable
        hashtable1,hashtable2 = createhashtable(nums1),createhashtable(nums2)
        for i in hashtable1.keys():
            if i in hashtable2.keys():
                n = min(hashtable1[i],hashtable2[i])
                for j in range(n):
                    num.append(i)
        return num

202. 快乐数

这种数字游戏,之前是难想到的,但是在中学时代,我记得我去玩过,如果不是快乐数的话,会不停地陷入一个循环之中去,所以可以把每一次计算的值用哈希表储存起来,重复的部分可以用一个函数不断调用即可!

class Solution:
    def isHappy(self, n: int) -> bool:
        #设计一个函数,计算数字的各位的平方和

        def sum_square(n):
        #     #分别找数来记录整除结果,余数,以及平方的和
            num = 0
            while n > 0:
                n,b = n//10,n%10
                num += b**2
            return num
        hashtable = dict()
        while n != 1:
            if n not in hashtable.keys():
                hashtable[n] = 1
                n = sum_square(n)
            else:return False
        #跳出循环说明是一个快乐数
        return True

但是好像如果只用判断元素是不是在哈希表中,不需要对应的值,可以用集合或者数组实现

        hashtable = set()

        while n != 1:

            if n not in hashtable:

                hashtable.add(n)

                n = sum_square(n)

            else:return False

类似的,用数组也肯定可以,对应的操作是append

 1. 两数之和 

又回到了梦开始的地方,还记得当时是写个双重循环暴力循环都会出错的时候,现在感慨时间过的好快啊!

简单再a一下吧!

记一下enumerate这个函数,还是比较重要的,在一次遍历中,可以读取列表中每个元素的下标以及下标处对应的值

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict()
        for i,num in enumerate(nums):
            if target - num not in hashtable.keys():
                hashtable[num] = i
            else:
                return [i,hashtable[target-num]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo2vec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值