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#include 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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)