代码随想录算法训练营Day5|leetcode349/242/202/1

leetcode 349

 链接:349. 两个数组的交集 - 力扣(LeetCode)

思路: 

方法1 直接用交集运算符

         return list(set(nums1) & set(nums2))

方法2 hash

         先对两个数组分别进行去重操作

        然后创建两个hash集合,第一个集合储存nums1的元素,然后第二个进行对比

        如果第二个数组中的元素在res1中出现过,那么就放到结果数组中去,最后转换为数组返回

代码:

                

#方法1 直接用交集运算符
        # return list(set(nums1) & set(nums2))
#方法2 
        nums1  = set(nums1)
        nums2 = set(nums2)
        result = set()
        result1 = set()
        for i in nums1:
            result1.add(i)
        for j in nums2:
            if j in result1:
                result.add(j)
        return list(result)

Leetcode242有效的字母异位词

链接:242. 有效的字母异位词 - 力扣(LeetCode)

思路:根据题意来看,出现的次数相同,也即意味着s&t都是同样的字母组成,所以首先我们用一个ord函数获取到当前字母的ACCSII码,然后向后获取s里面每个字符的accsii,这里减去a的意思说获取一个相对位置也就是当前字母离a的差值,然后每次加1算出当前出现的次数,例如从第一个数字开始是ord(a)-ord(a)这是等于0,然后+=1,即代表着在第0个索引出现了1此,

如下图所示:

 (上图来自于代码随想录录友提供,公众号:代码随想录)

举个例子,s='abbc',t = 'bbca'这里两个字符的开头一个是a一个是b,但是当他们经过ord()函数转换之后再减去‘a',都会匹配到他们在字符中对应的索引位置。

这个是我当时提出的问题:字母异位词我有一个问题,当我们创建一个26大小的数组,然后遍及第一个数组得到他们对应的哈希值存起来,然后再遍及第二个数组用他们的哈希值和第一个数组的相减,假如说是abbc和bbac。这里第一个数组存了abbc的哈希值,然后第二个数组是bbac的。但是这里数组开头的分别是a和b 那他们的哈希值相减怎么会等于0呢?

答案就是我上面说的 他们经过转换会找到自己对应的位置。

代码:

def isAnagram(self, s: str, t: str) -> bool:
        result = [0]*26 
        for i in range(len(s)):
            result[ord(s[i])-ord('a')]+=1
        for j in range(len(t)):
            result[ord(t[j])-ord('a')]-=1
        for x in result:
            if x!=0:
                return False
        return True

这里有一个地方需要注意哈:

                        for x in result:

                                   if x!=0:

                                        return False

                        return True

我最开始写的是return fasle if x!=0 else true

这里最根本的区别就是 我们的循环退出,如果用我一开始写的,循环到一半发现有不等于0的就直接返回fasle,后面的就不用管了。这样子看起来确实是没问题。

但是需要知道的是,false是可以循环中间判断出结果,但是true,我们必须要保证是遍历完所有字母都没问题才可以返回!!!!!

并且!这里如果用我一开始的这种写法,相当于if else只会判断第一个元素 然后返回了一个true直接退出循环!相当于只判断了第一个元素,ifelse只执行了一次!!!不会判断后面的元素了!

我真的要笨死了!居然是这个原因。。。。。

第一次做这种题,完全没有经验哈哈哈

Leetcode202快乐数

链接:202. 快乐数 - 力扣(LeetCode)

 

思路:

题目中说到,如果这个数字会导致无限重复,那么就可能是死循环,这是一个很重要的点,也是

判断的根本条件,也就是说 当我们发现拆分下去之后数字的平方和加起来和之前的某一次相等

那么就可以判断他不是一个快乐数可以直接返回false

所以我们创建一个结果集合来负责记录元素,当然这里用数组也可以哈!如果说当前数字在结果集合中已经出现过,那么就直接返回fasle了。

代码:

class Solution:
    def isHappy(self, n: int) -> bool:
        def calculate(num):
            sum_ = 0
            # 从个位开始依次取,平方求和
            while num:
                sum_ += (num % 10) ** 2
                num = num // 10
            return sum_

        # 记录中间结果
        record = set()

        while True:
            n = calculate(n)
            if n == 1:
                return True
            # 如果中间结果重复出现,说明陷入死循环了,该数不是快乐数
            if n in record:
                return False
            else:
                record.add(n)

      

Leetcode01 两数之和

链接:1. 两数之和 - 力扣(LeetCode)

 

思路:

使用hashmap对于每一个出现的数字检查,这里是两个数相加有一个目标值,那我们反过来做减法

如果说目标值减去当前的值的,他们的差值这个数字已经出现在hashmap里面,

那是不是可以直接返回他们的下标了

这里注意一个点,hashmap = {},是一个字典,如果说第一个数字2不在map中,那么

hashmap[2] = 0 这里不是指index第二个等于0哦,他的意思是说hashmap={2:0},是直接添加的!!

把2当作键,把0当作值,因为我们最终要取得是他们的下标,但是字典只能通过键访问值。

所以这里需要反过来写,不是写成hashmap[0]=2了哦,我第一次就是犯了这个错误 改了很久!!!!

代码:

def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        for key,value in enumerate(nums):
            another_value = target - value
            if another_value in hashmap:
                return [hashmap[another_value],key]
            else:
                hashmap[value] = key 
        return None

总结:写博客记录真的有好处 帮助自己再理清一遍思路 

        字母异位类型的题第一次做,对于需要用到ord函数不是很熟悉,用到accsii这种比较陌生

        两数之和是我载过n遍的题目了,今天是n+1。相信今天过后不会再栽跟头了!!!

hash很好用,这几道题基本都是第一次用这种思路 以后要加强看题的思维方式。如果加法不成那就做减法hhhhh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值