代码随想录算法训练营第六天

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

242. 有效的字母异位词

题目链接:有效的字母异位词

内置函数

之前做的时候非常的粗暴直接拿了python的内置函数来写的,就非常的懒。

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        #return sorted(s) == sorted(t)
        return Counter(s) == Counter(t)

哈希

重新考虑哈希法。
我自己的想法是给两个字符串做一个计数的哈希,其实就是自己把内置函数Counter(s)写了一遍,可能办法不是很好,但效果还可以。

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        if len(s) != len(t):
            return False
        d1 = {}
        d2 = {}
        for i in s:
            if i not in d1:
                d1[i] = 1
            else:
                d1[i] += 1
        for i in t:
            if i not in d2:
                d2[i] = 1
            else:
                d2[i] += 1
        return d1 == d2

注意,这里可以用defaultdict(int)来创建哈希,就不用和我的代码一样先判断有没有这个元素了,因为defaultdict如果没有这个key也会创建一个然后赋值为0

349. 两个数组的交集

题目链接:两个数组的交集

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        l = []
        for i in range(len(nums1)):
            if (nums1[i] in nums2) and (nums1[i] not in l):
                l.append(nums1[i])
        return l

Set()

可以直接用个set,set可以的到一个去重之后的列表。
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
添加元素用set.add()如果元素已经存在,则不报错,也不会添加,不会将字符串拆分成多个元素,去别update。
使用set.update添加一些元组列表,字典等,但不能是字符串,否则会拆分。
set.removeset.discard都是移除函数但是discard如果没有不会报错。
set.pop() 在list里默认删除最后一个,在set里随机删除一个。

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

202. 快乐数

题目链接:快乐数
题目解析:快乐数
这道题的重点其实是可能会无限循环,意思是求和的过程中,有一些sum会重复出现,当开始重复时,那么就开始无限循环了,这一点真的很难想到。

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        def happy_sum(n):
            n = str(n)
            sum = 0
            for i in n:
                sum += int(i)**2
            return sum
        
        l = []
        while 1:
            n = happy_sum(n)
            if n == 1:
                return True
            elif n in l:
                return False
            l.append(n)

1. 两数之和

暴力解法

题目链接:两数之和
以前就写过一个暴力解,能跑通但比较慢。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        d = len(nums)-1
        for i in range(d):
            for j in range((i+1),(d+1)):
                s = nums[i]+nums[j]
                if s == target:
                    return [i,j]

哈希

这道题,哈希表是用来存放我们遍历过得元素的。
例子:[2,7,3,6], target=9
hash = {}
首先走到2,去哈希表里找一找我们有没有走过7=9-2,没有;
那么把2存进哈希表里,然后去下一个7;
走到7,去哈希表里找一找有没有2=9-7,有,停下return
这里的重点是表里的元素不重复,并不会出现哈希冲突,所以key是元素,value是索引。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        h = {}
        for i in range(len(nums)):
            if target - nums[i] in h:
                return [h[target - nums[i]],i]
            h[nums[i]] = i
        return []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值