两个数组的交集
作者:互联网
1.规则:给定两个数组,写一个函数来计算他们的交集,输出结果的每个元素一定是唯一的
例如:arr1[]={1,2,3,4,5,6,7,8,9,10};arr2[]={7,5,3,1,9,9,9,10};交集arr[]={1,3,5,7,9,10};
2.思路:找出交集必定需要比较大小,可先进行排序使比较时更为方便,排序好之后分别arr1与arr2中的元素从首元素开始比较,(从小到大进行排序)若arr1中的元素大于arr2中的元素,则让arr2指向后一位元素在进行比较,若arr1中的元素小于arr2中的元素,则让arr1指向后一位元素在进行比较,若arr1中的元素与arr2中的元素相同,则把元素存放至arr数组中,若arr1、arr2数组中下一个元素与上一个元素相同,则跳过此元素向后寻找,由于需要比较多次可用循环来实现,若比较次数超过其中一个数组的长度,则比较结束。
// 两个数组的交集
#include <stdio.h>
#include <stdlib.h>
void My_lin(int arr[],int sz)//对数组进行排序
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
int lin(int arr1[], int arr2[],int arr[],int sz1,int sz2)//查找交集
{
int i = 0, j = 0;
int li = 0;//控制存放元素的位置
while (i < sz1 && j < sz2)//控制其两数组比较元素的次数
{
int qin = arr1[i];
int yan = arr2[j];
if (qin == yan)
{
arr[li] = qin;//若两数组中元素相同,则存放至arr数组中
li++;//让下标指向下一个位置
while (i < sz1 && arr1[i] == qin)//过滤掉nums1中重复元素
{
i++;
}
while (j < sz2 && arr2[j] == yan)//过滤掉nums2中重复元素
{
j++;
}
}
else if (qin < yan)//若nums1[i]指向的元素小于nums2[j]指向的元素,则让nums1向后继续找
{
i++;
}
else//若nums1[i]指向的元素大于nums2[j]指向的元素,则让nums2向后继续找
{
j++;
}
}
return li;//返回其元素个数
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 7,5,3,1,9,9,9,10 };
int sz1 = sizeof(arr1) / sizeof(arr1[0]);
My_lin(arr1, sz1);//对数组进行排序
int sz2 = sizeof(arr2) / sizeof(arr2[0]);
My_lin(arr2, sz2);
int* arr=(int*)malloc(sizeof(int) * sz1);//开辟一块与nums1大小一样的空间,存放两数组的交集元素
int li=lin(arr1, arr2, arr, sz1, sz2);//查找交集
for (int i = 0; i < li; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
标签:arr,两个,arr1,交集,元素,int,arr2,数组 来源: https://blog.csdn.net/qq_64425854/article/details/122751909