一、题目大意
已知两个数组,写一个函数来计算它们的交集。提示:不能重复出现,不要求顺序。
二、分析:
1,解题思想:两个数字A,B。把A,B中的都出现的放到另一个数组中。为了不重复,可以在放入的是时候,不放入重复的;也可以在结束后删除重复的。我们一般选择前者。
2,很明显可以用集合来操作。set和map都可以解决这个问题,下面会讨论。
3,java的集合操作要比python复杂的多,而且时间效果差距也很大,下面分别讨论。
三、java集合解决
1,set处理:
public static int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> nums = new HashSet<Integer>();
Set<Integer> result = new HashSet<>();
for(int i=0;i<nums2.length;i++) {
nums.add(nums2[i]);//放入时候去掉重复的
}
for(int i=0;i<nums1.length;i++) {
if(nums.contains(nums1[i])) {
result.add(nums1[i]);//放入交集
}
}
int[] res = new int[result.size()];
int i=0;
Iterator iter = result.iterator();
while(iter.hasNext()){
res[i++]=(int)iter.next(); //集合变数组
}
return res;
}
2,map处理:
public static int[] intersection2(int[] nums1, int[] nums2) {
Vector<Integer> ret = new Vector<>();
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int a:nums1) {
map.put(a, 1);//放入时候去掉重复的
}
for(int a:nums2) {
if(map.get(a) == 1) {
ret.add(a);//放入交集
map.put(a, 0);//不考虑重复的
}
}
int[] r = new int[ret.size()];
Iterator<Integer> iter = ret.iterator();
int i = 0;
while(iter.hasNext()) {
r[i++] = iter.next();//集合转数组
}
return r;
}
四、python集合解决
1,set处理:相对很慢
class Solution(object):
def intersection(self, nums1, nums2):
result = list()
for num in set(nums1) :
if num in nums2:
result.append(num)
return result
class Solution(object):
def intersection(self, nums1, nums2):
return [num for num in set(nums1) if num in nums2 #上面的缩写形似
2,set另一种解法,要快很多。用的是另外的运算符:
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
set1 = set(nums1)
ans = []
for x in nums2:
if x in set1:
ans += x,
set1.remove(x)
return ans
3,用python集合处理:(很快)
主要用集合的交运算,以及强制转换
lass Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
return list(set(nums1) & set(nums2))