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

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


前言

今天开始哈希表部分,以下默认各位了解哈希表。不了解的朋友请百度一下。


242.有效的字母异位词

题目链接

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true

示例 2: 输入: s = “rat”, t = “car” 输出: false

说明: 你可以假设字符串只包含小写字母。

(简单来讲,就是判断s和t是否具有相同的字母,仅仅是位置不同)

思路:

一串字符,最多包含26种字母。故创建数组record存放26个字母的个数。(意味着数组长度为26)

1、遍历s,每检测到一个字母,在record对应处+1。

2、再遍历t,每检测到一个字母,在record对应处-1。

最后对比,若 record 中全为0,返回 True ;否则,返回 False。

代码如下:

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

349. 两个数组的交集

题目链接

题意:给定两个数组,编写一个函数来计算它们的交集。

在这里插入图片描述

说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。

思路:

与上面的242相同,创建空数组count,遍历num数组,如果数组中包含某个数,就将这个count[数]+1
最后,遍历count数组,count1[i] * count2 [i] !=0:则表示这个数子需要输出

代码如下:

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        count1 = [0] *1001
        count2 = [0] *1001
        result = []
        for i in range(len(nums1)):
            count1[nums1[i]] += 1
        for i in range(len(nums2)):
            count2[nums2[i]] += 1
        for i in range(1001):
            if count1[i]*count2[i] != 0:
                result.append(i)
        return result

202. 快乐数

题目链接

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

思路

重复的将数字的各位平方求和,直到sum为1,或者无限循环。
很明显此处的重复执行应该是while循环,那么while 命题很重要。

无限循环,那么也就是说求和的过程中,sum会重复出现,因此用record数组记录所有出现的sum,一旦重复return false。

所以循环命题为: while sum不在record中:

代码如下:

class Solution:
    def isHappy(self, n: int) -> bool:
        record = []
        while n not in record:
            record.append(n)
            sum = 0
            for a in str(n):
                sum += int(a)**2
            if sum == 1:
                return True
            else:
                n = sum
        return False

1. 两数之和

题目链接

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思路:

啊,暴力好用,真的
两层for 循环,快速解决

代码如下:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        record = []
        for i in range(0,len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i] + nums[j] == target:
                    record.append(i)
                    record.append(j)
        return record

更高级的方法,下次用吧


总结

  1. 待改进: 对于这一块说的set没有弄明白,集合和字典基本忘光了。

  2. 收获: 242的思路很棒,值得学习

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值