PTA 练习7-4
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数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
本题采用C语言解法,用到goto语句辅助跳出多层循环;
分为两个步骤:1遍历第一组数,判断其中有没有与第二组中相同的元素,剔除这部分元素,对第二组数同理;
2 剔除第一组数中本来重复的数,如样例中第一组出现的两个3;
代码如下:
#include <stdio.h>
int main()
{
int a[20],b[20],c[20];
int i,j,A,B;
//分别读入数组a,b;
scanf("%d",&A);
for (i=0;i<A;i++) {
scanf("%d",&a[i]);
}
scanf("%d",&B);
for (i=0;i<B;i++) {
scanf("%d",&b[i]);
}
//判断a中是否有元素等于b[j];
int k=0;
for (i=0;i<A;i++) {
int t=1;
for (j=0;j<B;j++) {
if ( a[i]==b[j] ) {
t=0;
break;
}
}
//t=1标记了所有不等于b中的元素
if (t) {
c[k]=a[i]; //把a中所有不等于b的元素赋到数组c中
//下进行去掉a中本身的重复元素
if (k>0) {
int m=k;
while (m>0) {
if (c[k]==c[k-m]) {
k--;
goto out;
}
m--;
}
}out:
k++;
}
}
for (i=0;i<B;i++) {
int t=1;
for (j=0;j<A;j++) {
if ( b[i]==a[j] ) {
t=0;
break;
}
}
if (t) {
c[k]=b[i];
if (k>0) {
int m=k;
while (m>0) {
if (c[k]==c[k-m]) {
k--;
goto out1;
}
m--;
}
}out1:
k++;
}
}
for (i=0;i<k-1;i++)
printf("%d ",c[i]);
printf("%d",c[k-1]);
}
更新,上面方法太复杂了,一个月后的解题思路:先把第一组数在第二组数中不重复的部分拿出;由于重复数据是一样的,拿出第二组数中的不重复部分时可以不用再查找一次;拿出两组数中不重复的部分后,还要考虑每组数中的重复元素带来的麻烦.......(哈哈哈,有点绕,建议直接看代码对照理解):
代码:
//练习7-4 找出不是两个数组共有的元素 (20 分)
//给定两个整型数组,本题要求找出不是两者共有的元素。
//输入样例:
//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>
#define max 25
int main()
{
int m,n;int a[max],b[max];
scanf("%d",&m);
for (int i=0;i<m;i++) {
scanf("%d",&a[i]);
}
scanf("%d",&n);
for (int i=0;i<n;i++) {
scanf("%d",&b[i]);
}
//去掉两组中共有的就是不共有的,记c[k]
int c[40],k=0;int bs[25]={0};
for (int i=0;i<m;i++) {
int flag=0;
for (int j=0;j<n;j++) {
if (a[i]==b[j]) {
bs[j]=1;
flag=1;
}
}
if (flag==0) c[k++]=a[i];
}
for (int j=0;j<n;j++) {
if (bs[j]==0) c[k++]=b[j];
}
//此时输出为3 3 5 -15 6 4 6 1 (这是由于数组a,b自己内部重复元素造成的;
int cs[40]={0};
for (int i=0;i<k;i++) {
for (int j=i+1;j<k;j++) {
if (c[i]==c[j]) cs[j]=1;
}
}
int end;//找末尾的位置(不输出空格 ;
for (int i=k-1;i>=0;i--) {
if (cs[i]==0) end=i;
}
for (int i=0;i<k;i++) {
if (cs[i]==0) printf("%d",c[i]);
if (i!=end) printf(" ");
}
}