【PTA】找出不是两个数组共有的元素

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

输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数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

思路:
1、求并集;
2、交集-并集;
3、去重。

求 交集-并集 的两种方法:
法1:from我的大佬同学

妙点:
用两层循环进行比较,如果有相同的,则break后j<n;
若无相同的,则if判断成立;
break后少的是j++的步骤。

	//从a[0]开始,在数组b[]中找是否有与a[i]相同的数组	
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			if(a[i]==b[j])
				break;//在数组b[]中找到了与a[i]相同的值 
		}
		//在数组b[]中找不到与a[i]相同的值 
		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++;
		}
	}

法2:

我自己的,显然长且复杂的多。

	
	//2 取并集 
	int c[20],temp=0;
	for(int i=0;i<n1;i++)
	{
		for(int j=0;j<n2;j++)
		{
			if(a[i]==b[j])          //a数组里有数在b里,即相同的 
			{
				c[temp]=a[i];
				temp++;
				continue;
			}
		}
	}
	
	
	//3 合并数组
	int add[40];
	for(int i=0;i<n1;i++)
	{
		add[i]=a[i];		
	 } 
	 
	 for(int i=0;i<n2;i++)
	 {
	 	add[n1+i]=b[i];
	 }
	 
	 
	 //4 并集add-交集c
	 int ans[40];
	 int a1=0;
	 for(int i=0;i<n1+n2;i++) 
	 {
	 	int diff=0;
		 for(int j=0;j<temp;j++)
		 {
		 	if(add[i]!=c[j])  diff++;
		  } 
		  if(diff==temp)  
		  {
		  	ans[a1]=add[i];
		  	a1++;
		  }
	 }

去重的两种方法:
from法1的同学;

	//寻找在数组c[]中有没有重复的 
	for(i=1; i<k; i++){
		for(j=0; j<i; j++){
			if(c[i]==c[j])
				break;
		}
		if(j>=i)
			cout<<" "<<c[i];
	}

法2:
我的办法。这样一对比…我好菜o(TヘTo)

//5 列表去重
	 int ans2[40],ans3=0;
	 
	 for(int i=0;i<a1;i++)
	 {
	 	int compare=0;
		 for(int j=0;j<ans3;j++)
	 	{
	 		if(ans[i]!=ans2[j]) compare++;
		 }
		 if(compare==ans3)
		 {
		 	ans2[ans3]=ans[i];
		 	ans3++;
		 }
	 }

整体代码:
from我的大佬同学

#include<iostream>
using namespace std;
int main()
{
	int a[20], b[20], c[20];
	int m, n, i, j, k=0;
	
	cin>>m;
	for(i=0; i<m; i++)
		cin>>a[i];
	cin>>n;
	for(i=0; i<n; i++)
		cin>>b[i];
		
	//从a[0]开始,在数组b[]中找是否有与a[i]相同的数组	
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			if(a[i]==b[j])
				break;//在数组b[]中找到了与a[i]相同的值 
		}
		//在数组b[]中找不到与a[i]相同的值 
		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++;
		}
	}
	cout<<c[0];
	//寻找在数组c[]中有没有重复的 
	for(i=1; i<k; i++){
		for(j=0; j<i; j++){
			if(c[i]==c[j])
				break;
		}
		if(j>=i)
			cout<<" "<<c[i];
	}
	return 0;	
}

我自己的总有一个测试点没过,还在找原因中~待补。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值