Day6代码随想录哈希表part01-242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

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]

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值