赞
踩
刷到一些比较有意思的题目,发出来大家共同学习。
给定两个整型数组,本题要求找出不是两者共有的元素。
输入分别在两行中给出两个整型数组,每行先给出正整数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
解题思路:此题从常规思路出发是读取两个数组,再分别检查自身和彼此有没有重复元素,初步估计得四个嵌套循环,输出数组又是两个循环。很明显太麻烦。可以试着在读取时候控制不要在一个数组内读入重复元素,并在读取第二个数组时候,检查是否与第一个数组内的数据有重复。
我采取的是分别读取a[]和b[],分别控制a[]和b[]内没有重复元素,再分别核对彼此的重复元素,无重复输出。我的方法肯定不是最好的,希望大家多多指教。
- #include <stdio.h>
- int check(int a[],int cnt,int value){//检查数组a中是否有value,有的话返回下标
- int res=-1;
- for(int i=0;i<cnt;i++){
- if(value==a[i])res=i;
- }
- return res;
- }
- int main(int argc,char const *argv[]){
- int n,num;
- if(scanf("%d",&n));//输入第一个数组的长度
- int a[n];
- for(int i=0;i<n;i++){//读入第一个数组
- if(scanf("%d",&num));
- if(i==0){
- a[i]=num;
- }else{
- while(check(a,i,num)!=-1){//读取过程中,扫描前面的元素是否有重复
- if(scanf("%d",&num));//有重复重新读入,长度--;
- n--;
- }
- a[i]=num;
- }
- }
- int an=n;
- if(scanf("%d",&n));//读入第二个数组的长度
- int b[n];
- for(int i=0;i<n;i++){//读入第二个数组
- if(scanf("%d",&num));
- if(i==0){
- b[i]=num;
- }else{
- while(check(b,i,num)!=-1){//同样在读取过程中检查
- if(scanf("%d",&num));//有重复重新读取,长度--;
- n--;
- }
- b[i]=num;
- }
- }
- //读取结束后,两个数组中分别没有重复元素。 长度分别为an,bn
- int bn=n,flag=1;
- for(int i=0;i<an;i++){//逐一核对b中是否有a[i],没有的话输出
- int cnt=check(b,bn,a[i]);
- if(cnt==-1){
- if(flag==0)printf(" ");//flag控制空格的输出
- flag=0;
- printf("%d",a[i]);
- }
- }
- for(int i=0;i<bn;i++){//逐一核对a中是否有b[i],没有的话输出
- int cnt=check(a,an,b[i]);
- if(cnt==-1){
- if(flag==0)printf(" ");//flag控制空格的输出
- else flag=0;
- printf("%d",b[i]);
- }
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。