练习7-4 找出不是两个数组共有的元素(详解,超长代码警告) (20 分)

目录练习7-4 找出不是两个数组共有的元素 (20 分)输入格式:输出格式:输入样例:输出样例:前言:总结与收获:​最后美化紧凑版​伪代码逻辑实现的注释版​练习7-4 找出不是两个数组共有的元素 (20 分)给定两个整型数组,本题要求找出不是两者共有的元素。输入格式:输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。输出格式:在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但.
摘要由CSDN通过智能技术生成

目录

 

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

输入格式:

输出格式:

输入样例:

输出样例:

前言:

总结与收获:​

最后美化紧凑版​

伪代码逻辑实现的注释版​


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

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

输入格式:

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


前言:

这道题耗了我一天,一整天!都在debug!!!,写这篇博客是为了让我永远铭记曾经犯下的错,以及等我学成归来,要以傲视群雄的姿态对这道题说一句:呵呵,就这?

第一步:读懂题意,明确任务。

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

解读:此条件看上去人畜无害,实则让你不能用构造函数的方式实现输入。(反证我是不会!)只能分两次输入,其实现也比较简单,核心逻辑如下,用两次,两次的循环变量都可以用 int i

    for (int i = 0; i < na; i++) { //i语句内的循环变量,离开语句就失效,因为本题会用很多次循环,有些循环变量需的变量作用域比较大,有利于重复利用变量名
        scanf("%d",&a[i]);
    }

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

兄弟们,看上个这条件,表面上简简单单的,实际上句句都是要点,句句的实现都要人掉头发!

首先我们用过样例来具体理解和分析一下:

输入样例的具体形式:

假设na=10 ,则输入的  数组每个值具体如下:a[0]=3     a[1]=-5     a[2]=2     a[3]=8     a[4]=0     a[5]=3     a[6]=5     a[7]= -15    a[8]=9    a[9]=100

假设nb=11 ,则输入的  数组每个值具体如下:b[0]=6      b[1]=4      b[2]=8     b[3]=2     b[4]=6     b[5]= -5    b[6]=9     b[7]=0      b[8]=100     b[9]=8     b[10]=1

输出样式分析:

条件指出:要输出的数据  “不是两数组共有的元素” ,

         其基本逻辑便是: 首先拿数组a的第一个元素3 依次和数组b中的每一个元素进行比较,若有相同就跳过本a[ i ] ,继续拿数组a的下一个元素重新和b数组的第一个比较。

                                      直到和b数组的每一个元素都比较依次,而且每一个都不相同,则可以输出数组a[ ] 在该个位置的值。

                                     比如 a[0]=3 和b数组的每一个元素都不相同,所以可以输出3。

为了各位看起来方便:我把数组a和数组b中,对应一致的颜色标记成一样的。

所以我们可以简单的思考:首先通过简单的循环比较,把两个数组之间 不是共同的元素找出来,然后直接输出

但是,这里我们看到了出题人的险恶之处,数组a 内部 0 号位置  和 5 号位置 都是3 重复了, 数组b内部 0号位和4 号位重复了。 所以不能直接输出,除此之外,还有行末不得有多余的空格,这种恶心的条件也同样对输出格式做出了严格的限制。

所以我们自然要思考另外一种方式,本章主要是学习内容是数组,所以自然而然我们可以新建一个数组C 先存储比较的出来的数值 ,最终其内部变量应该为C[ ] ={3 , 3 ,5 , -15 , 6 , 4 ,6 ,1},然后,我们在通过遍历这个数组,不重样的输出结果。

还有一种思维方式:就是在将数组A B比较的结果,在存入输出 数组C之前,就先查看,数组C内部是否已经有了和当前找到的  非共同元素  相等的值,若已经存在,就跳过这次的存储。

通过上述的分析:

任务2可继续拆解成5个小步骤。

伪代码:

步骤1:在数组A中按序取一个值 (for 的 i 到 na 的循环,此处的循环变量 用 mian() 函数内部的全局变量) 第一层遍历数组A的 i 循环

                  依次和数组B的第一个到最后一个比较, (for 的 j 到 nb 的循环)                     第二层遍历数组B的 j 循环

                           若提前相同,则提前跳出本轮对于数组 A 中第 i 号位置的循环。i ++  ,判断数组A的下一个位置 的值是否是 数组B没有的。

                           若数组B遍历完了 都没有找到和数组A对应 i 号位匹配的值,则可以把改数值 传给输出数组C。

步骤1内部的步骤3:              在传给输出数组C之前还要判断数组C内部是否已经有和当比较得到的 非共同元素 相等的值,若已经存在,就跳过这次的存储。  第三层遍历数组C的判重循环

 

步骤2:和步骤1逻辑上完全相同,只是这里是在在数组B中按序取一个值,依次和数组B的第一个到最后一个比较这里就不赘述了。

步骤2内部的步骤3 :同上,略了

 

步骤4:执行完上述任务,就得到了一个没有重复数据的数组C,然后就是按照行末不得有多余的空格的方式输出结果,顺序遍历循环输出结果即可

三重循环,你说新手怎么受得了!!! 难怪我

  • 73
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值