题目描述:
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
我的解法思想:
1.利用两个嵌套for循环,外循环的循环变量i代表第一个数组中元素,内循环的循环变量j代表第二个数组中的元素。
2.若nums1[i]==nums2[j];则将nums2[j]交给新数组A存贮。
3.nums1从i位置起统统将后一个元素往前移动一位,将i位置覆盖。同时令length1--;因为i位置代表新的元素,所以i--,从新比 较i位置的元素。
4.nums2同理,但j不需要j--;因为j每次循环都是从0开始。每个元素在其内部变动对循环无影响。
5.然后break;跳出此次内循环。
代码:
class Solution {
public static void intersect(int []nums1,int []nums2) {
int []A=new int[nums1.length];
int length1=nums1.length;
int length2=nums2.length;
int e=0;
for(int i=0;i<length1;i++) {
for(int j=0;j<length2;j++) {
if(nums1[i]==nums2[j]) {
A[e]=nums2[j];
e++;
for(int b=i;b<length1-1;b++)
nums1[b]=nums1[b+1];
length1--;
for(int m=j;m<length2-1;m++)
nums2[m]=nums2[m+1];
length2--;
i--;
break;
}
}
}
for(int i=0;i<A.length;i++) {
if(A[i]!=0)
System.out.println(A[i]);
}
}
public static void main(String []args){
int []A={1,3,5,4,7,51,9,8,7,4,65,3};
int B[]={1,1,98,3,564,32,8,65,45,87};
intersect(A,B);
}
}
输出结果:
[1,3,8,65]
注意:
一定要length1=nums1.length和length2=nums2.length。然后再length1--和length2--,不能直接对nums1.length和nums2.length进行自减操作,否则会报错。