【数据结构与算法】之哈希表系列-20240131

【数据结构与算法】之哈希表系列-20240131_第1张图片


这里写目录标题

  • 一、599. 两个列表的最小索引总和
  • 二、1122. 数组的相对排序
  • 三、1002. 查找共用字符
  • 四、771. 宝石与石头
  • 五、961. 在长度 2N 的数组中找出重复 N 次的元素

一、599. 两个列表的最小索引总和

简单
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。

示例 1:
输入: list1 = [“Shogun”, “Tapioca Express”, “Burger King”, “KFC”],list2 = [“Piatti”, “The Grill at Torrey Pines”, “Hungry Hunter Steakhouse”, “Shogun”]
输出: [“Shogun”]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。

示例 2:
输入:list1 = [“Shogun”, “Tapioca Express”, “Burger King”, “KFC”],list2 = [“KFC”, “Shogun”, “Burger King”]
输出: [“Shogun”]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。

class Solution:
    def twos(self,list1,list2):
        d=defaultdict(list)
        for i in (set(list1) & set(list2)):
            d[list1.index(i)+list2.index(i)].append(i)
        return min(d.items())
ss=Solution()
list1= ["Shogun", "Tapioca Express", "Burger King", "KFC"]
list2 = ["KFC", "Shogun", "Burger King"]
print(ss.twos(list1, list2))

二、1122. 数组的相对排序

简单
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

示例 1:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]

示例 2:
输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出:[22,28,8,6,17,44]

class S1122:
    def func(self, arr1, arr2):
        res = []
        for i in arr2:
            count = arr1.count(i)
            while count != 0:
                res.append(i)
                count -= 1
                arr1.remove(i)
        res = res + sorted(arr1)
        return res


res = S1122()
arr1 = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19]
arr2 = [2, 1, 4, 3, 9, 6]
print(res.func(arr1, arr2))

三、1002. 查找共用字符

简单
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。

示例 1:
输入:words = [“bella”,“label”,“roller”]
输出:[“e”,“l”,“l”]

示例 2:
输入:words = [“cool”,“lock”,“cook”]
输出:[“c”,“o”]

class Solution:
    def func1002(self,words):
        res=[]
        key=set(words[0])
        for k in key:
            minimum=min(a.count(k) for a in words)
            res+=[k]*minimum

        return res

r=Solution()
words = ["bella","label","roller"]
print(r.func1002(words))

四、771. 宝石与石头

简单
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
字母区分大小写,因此 “a” 和 “A” 是不同类型的石头。

示例 1:
输入:jewels = “aA”, stones = “aAAbbbb”
输出:3

示例 2:
输入:jewels = “z”, stones = “ZZ”
输出:0

class Solution:
    def func771(self,j,s):
        return sum([s.count(i) for i in j])
r=Solution()
j = "z"
s = "ZZ"
print(r.func771(j, s))

五、961. 在长度 2N 的数组中找出重复 N 次的元素

简单
给你一个整数数组 nums ,该数组具有以下属性:
nums.length == 2 * n.
nums 包含 n + 1 个 不同的 元素
nums 中恰有一个元素重复 n 次
找出并返回重复了 n 次的那个元素。

示例 1:
输入:nums = [1,2,3,3]
输出:3

示例 2:
输入:nums = [2,1,2,5,3,2]
输出:2

示例 3:
输入:nums = [5,1,5,2,5,3,5,4]
输出:5

依照题意,其实发现一个元素出现两次就能确定答案了。具体做法是用哈希表存储遍历过的元素,发现遍历过的元素即返回。

class Solution:
    def repeatedNTimes(self, nums: List[int]) -> int:
        s = set()
        for i in nums:
            if i in s:
                return i
            else:
                s.add(i)
        return -1

s=Solution()
nums = [5,1,5,1,5,3,5,4]
print(s.repeatedNTimes(nums))

【数据结构与算法】之哈希表系列-20240131_第2张图片

你可能感兴趣的:(数据结构与算法,散列表,数据结构,python,leetcode,开发语言,算法)