目录
练习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,然后就是按照行末不得有多余的空格的方式输出结果,顺序遍历循环输出结果即可
三重循环,你说新手怎么受得了!!! 难怪我