求职 力扣 刷题 day06----哈希表

13. 哈希表

13.1 242.有效的字母异位词

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

**注意:**若 *s**t* 中每个字符出现的次数都相同,则称 *s**t* 互为字母异位词。

思路

  1. 使用数组作为哈希表存储数据
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        char_counts = [0] * 26
        for char in s:
            index = ord(char) - ord('a')
            char_counts[index] += 1
        for char in t:
            index = ord(char) - ord('a')
            char_counts[index] -= 1
        
        for cnt in char_counts:
            if cnt != 0:
                return False
        return True

13.2 349. 两个数组的交集

给定两个数组 nums1nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

哈希表,两次遍历

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set_1 = set()
        for num in nums1:
            if num not in set_1:
                set_1.add(num)
        res_set = set()

        for num in nums2:
            if num in set_1 and num not in res_set:
                res_set.add(num)
        
        return list(res_set)

13.3 202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

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

如果 n快乐数 就返回 true ;不是,则返回 false

思路:

使用哈希表储存之前遍历过的数字,如果已经遍历过,表示重复则为False

class Solution:
    def isHappy(self, n: int) -> bool:
        num_set = set()
        num_set.add(n)
        while n != 1:
            res = 0
            while n:
                cur = n % 10
                res += cur ** 2
                n = n // 10
            n = res
            if n not in num_set:
                num_set.add(n)
            else:
                return False
        return True

13.4 1. 两数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

思路:

  1. 排序得到升序索引(sorted加lambda函数)
  2. left, right = 0, len(nums) - 1 双指针
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:

        nums_sort_index = sorted(range(len(nums)), key=lambda x:nums[x])

        left, right = 0, len(nums) - 1
        while left < right:
            left_index = nums_sort_index[left]
            right_index = nums_sort_index[right]
            if nums[left_index] + nums[right_index] > target:
                right -= 1
            elif nums[left_index] + nums[right_index] < target:
                left += 1
            else:
                return [left_index, right_index]
        return

方法二:使用字典(推荐)

        #使用字典
        res_dict = dict()
        for index, num in enumerate(nums):
            if target - num in res_dict:
                return [index, res_dict[target - num]]
            else:
                res_dict[num] = index
        return
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云墨丹青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值