题目如下:
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].
注意:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
先讲一下我的情况,新入坑的自学者,代码菜鸟级别,目前只会写C语言,所以我的题目都是用C语言写的哈,而且代码会有很多可以优化的地方,这里就抛砖引玉,仅供大家参考了。
如果选择用C语言写,LeetCode还有两个隐含的题目要求:Return an array of size *returnSize. The returned array must be malloced, assume caller calls free().——注释里的这句话的意思是,要求最后要将输出的数组的长度返回到returnSize的变量中,要用malloc函数动态创建数组,调用者会释放内存,不用创建者释放,如果不按这两个要求,输出数组是空的。
然后讲一下我对这题的思路,求两个数组的交集,并且重复的数字也要包含,所以可以依次遍历数组1,先判断一下元素1是否已经包含在新数组里,如果包含,证明已经统计过了,跳出循环,如果没有,分别求出元素1在数组1和数组2的个数,判断如果数组2也包含元素1,比较个数,按个数少的数量将元素1依次写进新数组。
这里有一个问题,你怎么知道每次插入数组的位置呢?我们就要用标记记录每次插入的元素数量,这样下一次插入元素就知道从哪里开始了。
再讲一下踩的一个坑,用malloc函数动态创建数组,系统会自动将数组所有元素初始化为0,所以0的情况要先处理。
具体来看一下代码:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
if(nums1Size <= 0 || nums2Size <= 0){
return 0;
}
int newArrSize = nums1Size+nums2Size;
int *newArr = (int *)malloc(sizeof(int) * newArrSize);
int cnt3=0;//这是插入数组位置的标记,也就是最后生成交集数组的长度
int zero1=0;//这里开始,先求出0的交集情况
int zero2=0;
for (int i=0; i < nums1Size; i++){
if (nums1[i] == 0){
zero1 += 1;
}
}
for (int i=0; i < nums2Size; i++){
if (nums2[i] == 0){
zero2 += 1;
}
}
if (zero1 >= zero2 && zero2 != 0){
for (int i=0; i<zero2; i++){
newArr[i] = 0;
}
cnt3 = zero2;
}
if (zero1 < zero2 &&zero1 != 0){
for (int i=0; i<zero1; i++){
newArr[i] = 0;
}
cnt3 = zero1;
}
for (int i=0; i < nums1Size; i++){ //这里开始遍历数组1
int num=nums1[i];
int flag=0;
for (int a=0; a <= cnt3; a++){
if (newArr[a] == num ){
flag = 1;
break;//如果新数组已经存在这个元素,就跳出循环;
}
}
if(flag == 1){
continue;
}
//下面开始插入相同的元素
int cnt1=0;
for (int j=0; j < nums1Size; j++){
if (nums1[j] == num){
cnt1++;
}
}
int cnt2=0;
for (int h=0; h < nums2Size; h++){
if (nums2[h] == num){
cnt2++;
}
}
if (cnt2 >= cnt1){
for (int k=0; k < cnt1; k++){
newArr[cnt3+k]=num;
}
cnt3 = cnt3+cnt1;
}
if (cnt2 < cnt1 && cnt2 > 0){
for (int k=0; k < cnt2; k++){
newArr[cnt3+k]=num;
}
cnt3 = cnt3+cnt2;
}
}
*returnSize = cnt3;
return newArr;
}