[英]Find intersection of two arrays in python
我正在练习 leetcode。 这是问题。https://leetcode.com/problems/intersection-of-two-arrays-ii/ :
给定两个整数数组
nums1
和nums2
,返回它们的交集数组。 结果中的每个元素必须出现与它在两个数组中显示的一样多的次数,并且您可以按任何顺序返回结果。
我在哪里做错了?
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.