7-136 找出不是两个数组共有的元素 (20 分)

这是一个编程问题,目标是找出两个给定的整型数组中不共有的元素。三个提供的代码示例分别使用不同的算法实现该功能,通过遍历数组并检查元素是否存在另一数组中来找到唯一元素。输出结果会按照数字顺序列出这些元素。
摘要由CSDN通过智能技术生成

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1

代码一:

#include<stdio.h>
int main(){
    int m,n,i,j,k=0,l,flag;
    scanf("%d",&m);
    int a[m];
    for(i=0;i<m;i++){
        scanf("%d",&a[i]);
    }
    scanf("%d",&n);
    int b[n];
    for(i=0;i<n;i++){
        scanf("%d",&b[i]);
    } int c[m+n];
    for(i=0;i<m;i++){
        flag=0;
        for(j=0;j<n;j++) if(a[i]==b[j]){flag=1;break;}
        if(flag==0) c[k++]=a[i];
    }
     for(j=0;j<n;j++){
        flag=0;
        for(i=0;i<m;i++) if(a[i]==b[j]){flag=1;break;}
        if(flag==0) c[k++]=b[j];
        }
    for(i=0;i<k;i++){
        for(j=i+1;j<k;j++) if(c[i]==c[j]){
            for(l=j;l<k-1;l++) c[l]=c[l+1];
            k--; }
    }
    for(i=0;i<k;i++){
        printf("%d",c[i]);
        if(i<k-1) printf(" ");
    }
}

代码二:

#include <stdio.h>  
int main()    
{  
    int m;
    while(scanf("%d",&m)!=EOF){   
        int a[20],i;
        for(i=0;i<m;i++)
            scanf("%d",&a[i]);
        int n;
        scanf("%d",&n);
        int b[20];
        for(i=0;i<n;i++)
            scanf("%d",&b[i]);
        int j;
        int c[20],k;
        k=0;
        for(i=0;i<m;i++){ 
            for(j=0;j<n;j++) {
                if(a[i]==b[j])
                    break;
            }
            if(j>=n) {
                c[k]=a[i];
                k++;
            }
        }
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                if(b[i]==a[j])
                    break;
            }
            if(j>=m){
                c[k]=b[i];
                k++;
            }  
        }
        printf("%d",c[0]);
        for(i=1;i<k;i++){
            for(j=0;j<i;j++){
                if(c[i]==c[j])
                    break;
            }
            if(j>=i)
                printf(" %d",c[i]);
        }
        printf("\n");
    }
    return 0;
}

代码三:

#include <stdio.h>
int main()
{
    int i,j,n,m,a[20],b[20],r[40],temp=0,t,f=0,p=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(j=0;j<m;j++)
        scanf("%d",&b[j]);
    for(i=0,--m;i<n;i++)
    {
        for(t=0;t<temp;t++)
        {p=0;if(a[i]==r[t])
		{p++;break;}}
		if(p)continue;
        for(t=m;t>=0;t--)
        {
            if(a[i]==b[t])
            {
                f++;break;
            }
        }
        if(!f)
        {r[temp]=a[i];
        temp++;}
        f=0;
    }
     for(i=0,--n;i<=m;i++)
    {
        for(t=0;t<temp;t++)
        {p=0;if(b[i]==r[t])
        {p++;break;}}
		if(p)continue;
        for(t=n;t>=0;t--)
        {
            if(b[i]==a[t])
            {
                f++;break;
            }
        }
        if(!f)
        {r[temp]=b[i];
        temp++;}
        f=0;
    }
    for(i=0;i<temp-1;i++)
        printf("%d ",r[i]);
    printf("%d",r[temp-1]);
    return 0;
    
    
}
### 回答1: 这道题目要求我们找出两个数组中不共有元素。我们可以先将两个数组合并成一个新的数组,然后遍历这个新数组找出只在其中一个数组中出现的元素即可。具体实现可以使用哈希表来记录每个元素出现的次数,然后再遍历一遍哈希表,找出只出现过一次的元素即可。 ### 回答2: 题目描述: 给定两个长度别为 n 和 m 的数组 A 和 B。请你从 A 和 B 中各找出一个数,使得这两个数的差最小。(即找到 A 集合和 B 集合中的一对数,它们的差的绝对值最小) 思路析: 此题需要我们进行一定的数学推导。我们假设我们的两个数组 A 和 B 都是从小到大排好序的,那么我们可以用两个指针 i 和 j 来代表 A 和 B。同时,我们可以设定一个变量minDiff用来存储当前最小的差值。我们把 A[0] 和 B[0] 的差值作为初始值存入minDiff,然后我们再用以下的方法来找到最小的差值: 1. 如果 A[i] 比 B[j] 小,那么我们就将 i++ 就可以找到一个更大的数; 2. 同理,如果 A[i] 比 B[j] 大,那么我们就将 j++ 就可以找到一个更大的数; 3. 如果它们相等,那么差值为0,直接返回即可。 代码实现: ```python def minDifference(A, B): i, j, minDiff = 0, 0, abs(A[0] - B[0]) while i < len(A) and j < len(B): diff = abs(A[i] - B[j]) if diff < minDiff: minDiff = diff if A[i] < B[j]: i += 1 else: j += 1 return minDiff ``` 时间复杂度:O(n+m),其中 n 和 m 别代表了 A 和 B 的长度。 总结: 通过本题,我们可以看到双指针在数组有序的情况下是一种非常高效的算法。但是需要注意,这种算法并不局限于两个数组的问题,同样适用于单个数组中的问题。如果在解决问题时需要用到迭代或者数组,那么我们可以考虑一下双指针算法。 ### 回答3: 给定两个数组A和B,要求找出A和B中不共有元素。 首先需要了解什么是两个数组共有元素两个数组共有元素就是指同时出现在A和B中的元素,也就是交集部。因此,不共有元素就是指只出现在A或B中的元素,也就是并集中除去交集的元素。 一种简单的思路是先将A和B的交集求出来,然后用这个交集部去除A和B的并集即可得到不共有元素。 具体做法如下: 1. 定义一个新的数组C,用来存放A和B的交集部。 2. 通过双重循环遍历数组A和B,如果某个元素在A和B中都出现过,则将其加入数组C中。 3. 定义一个新的数组D,用来存放A和B的并集部。 4. 将数组A和B中的所有元素加入数组D中。 5. 遍历数组C,将数组D中与C中元素相同的元素删除。 6. 最终得到的数组D即为A和B中不共有元素。 代码示例: ```python A = [1, 2, 3, 4, 5] B = [3, 4, 5, 6, 7] C = [] D = A + B #寻找交集 for i in A: for j in B: if i == j: C.append(i) #去除交集 for k in C: if k in D: D.remove(k) print(D) #输出结果为[1, 2, 6, 7] ``` 上述代码中,先定义了两个数组A和B,以及一个空数组C和一个合并了A和B的数组D。双重循环遍历A和B,如果某个元素在A和B中都出现过,则将其加入数组C中。再遍历数组C,将数组D中与C中元素相同的元素删除,最终得到的数组D即为A和B中不共有元素。 需要注意的是,上述方法仅适用于两个数组的情况。如果要处理多个数组的情况,则需要先对所有数组求并集,然后再将所有数组的交集部从并集中删除,得到最终的不共有元素数组
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值