代码随想录算法训练营第六天|242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

本文介绍了如何使用哈希表和Python内置库如Counter解决字符串异位词问题,利用集合快速找到两个数组的交集,以及使用字典优化两数之和问题。通过实例展示了Python编程中的简洁编码技巧。
摘要由CSDN通过智能技术生成

题目和思路:

一、242.有效的字母异位词

Day2时候做水果成篮已经使用过哈希表,想起来应用上次学到的写法:

dict[key] = dict.get(key,0)+1

方法一:本题思路比较清晰,根据s建字典,再遍历t,跟哈希表进行比较,遇到相同字符字典对应键的值-1,直到变成0,删除该键;遇到不在表内的字符,return False;循环结束后还需要判断字典是否为空,空字典返回True说明一模一样,否则返回False。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        s_dict = {}
        for _ in s:
            s_dict[_] = s_dict.get(_, 0) + 1

        for character in t:
            if character not in s_dict:
                return False
            else:
                s_dict[character] -= 1
                if s_dict[character] == 0: del s_dict[character]
        
        if s_dict:
            return False
        else:
            return True

方法二:其实python有自己的开挂方式——collections库...

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import Counter
        s_dict = Counter(s)
        t_dict = Counter(t)
        return s_dict == t_dict

方法三:使用数组作为哈希表(参考代码随想录):

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        dd = [0 for _ in range(26)]
        if len(s) != len(t): return False
        else:
            for i in range(len(s)):
                dd[ord(s[i]) - ord('a')] += 1
                dd[ord(t[i]) - ord('a')] -= 1
            return not any(dd)

二、349. 两个数组的交集

其实python的set其实有点过于强大了,以至于...

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1) & set(nums2))

还是装模作样写一下...

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        s1 = set()
        res = set()

        for _ in nums1:
            s1.add(_)
        
        for _ in nums2:
            if _ in nums1:
                res.add(_)
        
        return list(res)

三、202. 快乐数

使用哈希表跳出死循环,如果n的当前值出现过第二次,意味着要死循环了,这时候使用哈希表可以轻松跳出死循环。代码如下:

class Solution:
    def sqrSum(self, n):
        cnt = 0
        while n:
            cnt += (n % 10) ** 2
            n = n // 10
        return cnt

    def isHappy(self, n: int) -> bool:
        loop_dict = set()

        while n != 1:
            if n not in loop_dict:
                loop_dict.add(n)
            else: 
                return False
            
            n = self.sqrSum(n)
        return True

代码随想录上有一个快慢指针实现的方法,用快慢指针来判断是否有“环”,也就是死循环,赞一下但是不写!

python有一个可以简化代码的pythonic写法:

n = sum(int(_) ** 2 for _ in str(n))

学!

四:有人相爱,有人夜里开车看海,有人力扣第一题写不出来(doge)1. 两数之和

n年前确实不会写,今天估计可以了!

使用字典做哈希表,key表示已经遇到的值,value表示值对应的下标。每一次迭代判断target减去当前值的差值,如果在字典内,则返回当前索引和查到的value,否则将当前值和索引写入字典。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        another = {}
        for i,num in enumerate(nums):
            if target - num in another:
                return [another[target-num],i]
            else:
                another[num] = i

今日总结:

今天内容不算难,练习一下pythonic coding,可以在总计20行内解决今天的四个题目。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值