繁体   English   中英

在python中找到两个数组的交集

[英]Find intersection of two arrays in python

我正在练习 leetcode。 这是问题。https://leetcode.com/problems/intersection-of-two-arrays-ii/

给定两个整数数组nums1nums2 ,返回它们的交集数组。 结果中的每个元素必须出现与它在两个数组中显示的一样多的次数,并且您可以按任何顺序返回结果。

我在哪里做错了?

def intersect(nums1: List[int], nums2: List[int]) -> List[int]:
    ht = dict()
    length1 = len(nums1)
    length2 = len(nums2)
    longer = []
    smaller = []
    intersection = []
    if length1 > length2:
        longer = nums1
        smaller = nums2
    else:
        longer = nums2
        smaller = nums1
    
    for i in range(len(longer)):
        ht[i] = longer[i]
        
    for j in range(len(smaller)):
        if smaller[j] in ht:
            intersection.append(smaller[j])
        else:
            j += 1
    return intersection

答案被接受

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]

但是,它失败了

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]

我的输出是[4]

问题是您正在检查smaller[j] in ht是否默认检查每个smaller[j]是否在 ht 的键中。 键是您设置为较长数组的索引的 ht。

你可以只用更换if smaller[j] in ht.values()但你可以很废除ht字典,并通过检查实现它smaller[j]longer

见下文;

def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:

    length1 = len(nums1)
    length2 = len(nums2)
    longer = []
    smaller = []
    intersection = []
    
    if length1 > length2:
        longer = nums1
        smaller = nums2
    else:
        longer = nums2
        smaller = nums1

    for j in range(len(smaller)):
        if smaller[j] in longer:
            intersection.append(smaller[j])
        else:
            j += 1
    return intersection

TL;DR:有几个东西在我看来是错误的,我稍后会详细说明。

我最大的建议是,在这个函数中,你有两个步骤“计算列表中的数字”和“计算列表的交集”。 您应该分别对它们进行编码,制作一些测试用例以检查它是否有效,然后运行整个循环。 (有了这些测试用例,你会很快发现哪里出了问题)


我觉得有什么不对:

1)

for i in range(len(longer)):
    ht[i] = longer[i]

在这里,我想您想计算实例的数量。 例如,如果 nums1 = [5, 8, 8],你想要一个 dict {5: 1, 8: 2}

这不是你的循环在做什么。 它说的是哪个索引的数字(您的循环返回 {1: 5, 2: 8, 3: 8})

并且“for i in range(len(list))”并不是很pythonic。 你应该做:

for number in in longer:
   ht[number] = ht.get(number, 0) + 1
for j in range(len(smaller)):
    if smaller[j] in ht:
        intersection.append(smaller[j])
    else:
        j += 1

为什么要增加索引 j ? 另外,遇到时需要减少hf[number[j]]

for number in smaller:
    if ht.get(number, 0) > 0:
        intersection.append(number)
        ht[number] -= 1

我会编码

from collections import Counter

 def calc_intersect(nums1, nums2):
     num_to_count_1 = Counter(nums1)
     intersect = []
     for num in nums2:
         if num_to_count_1[num] > 0:
             intersect.append(num)
             num_to_count_1[num] -= 1
     return intersect

你让它变得比实际更复杂。 尝试这个:

class Solution():
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def intersect(self):
        return [x for x in self.a if x in self.b]
    
print(Solution([4,9,5],[9,4,9,8,4]).intersect())

我建议使用列表理解,这是一个非常快速的工具。 那么代码将是

intersect1 = [el for el in nums1 if el in nums2]
intersect2 = [el for el in nums2 if el in nums1]

if len(intersect1) < len(intersect 2):
    result = intersect1
else:
    result = intersect2

您需要计算两个相交列表才能得到正确的结果。 较小的相交列表是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM