C语言找画笔(全网最详)

简介: C语言找画笔(全网最详)

题目:

豆豆对数字的执着,让他在理科领域游刃有余,但他近乎疯狂的投入也使父母有些担心,为了让孩子能够全面发展,决定拓宽他的学习领域。正好家旁边有个绘画培训中心,父母就给豆豆报了名。学习绘画的第一天就让豆豆产生了浓厚的兴趣,还主动要求买了很多很多的画笔。画笔有多种颜色,豆豆有一个习惯就是同种颜色的画笔就买两支,一支备用,这样就总共攒了 N 支画笔(N 是偶数且 1<N<100000)。

可是数字的敏感无孔不入,豆豆脑里蹦出了一个奇怪的问题:如果蒙上眼任意拿走一支画笔,分析剩下的 N-1 支画笔就能找出拿走了哪种颜色,你能回答他吗?

输入格式:

第一行一个整数N(N 是偶数且 1<N<100000),表示剩下的画笔个数就是题目描述中的 N-1。

第二行 N-1 个用空格隔开的正整数 Ai(0<Ai<100000),表示剩下的画笔的颜色编号。

注意:数据保证有一个画笔的颜色编号出现了一次,其余的都出现了两次。

输出格式:

一个整数,表示拿走的画笔的颜色编号。

输入样例:

10
1 1 9 11 5 3 11 5 9

输出样例:

3

点睛:此题含义是在一组乱序数组里面,有多组相同的元素个数为2,只有一组数据的个数是1,本题需要将哪一个单独的数组查找出来。

解答:此题有两种算法。

法一:利用排序函数进行查找(因为sort函数只适用于C++,所以此法C语言不适用)

思路:

  1. 如何在不设置变量情况下,输入N?可以先开一个很大的数组,再进行变量输入。
  2. 此法核心在于如何在已经排序的数组里查询单个元素?因为元素已经排序完毕,相同的元素都是两个两个排序在一起,所以只需两个一查找,即在第二个for循环中i+=2非常重要!!!

image.png

法二:利用按位异或操作符(重点!!!也是最难理解的)

首先,我们需要先回顾一下^操作符的运算规则。

  • 若两个数相同,则输出结果就是0,若两个数不同,输出结果就是1;
  • 任何值与自身异或,结果为0
  • 任何值与0异或,结果为其自身
  • 交换律 a^b^c=b^a^c
  • 结合律

我们了解之后,可以这样理解,我们在初始化数组内容后,都是两个相同为一组,只有一个落单,根据交换律,直接将两个相同放在一起,输出结果就是0;这时又根据任何值与0异或等于值本身,综上可以把落单的那一个直接输出。

image.png

相关文章
|
7月前
|
算法 C语言 C++
【c语言】飞机大战(1)
【c语言】飞机大战(1)
61 1
|
5月前
|
C语言
C语言实战 | 弹跳的小球
【7月更文挑战第6天】使用C语言实现了一个小球(小方块)在屏幕上斜向移动并反弹的程序。当小球碰到边界时,其运动方向会发生改变。代码分为三部分,分别处理初始化、主循环和更新位置及边界检测。变量drow和dcol控制移动方向,遇到边界时会反转它们的值。
79 3
C语言实战 | 弹跳的小球
|
7月前
|
存储 算法 程序员
零基础C语言“函数”教程,有手就行
零基础C语言“函数”教程,有手就行
|
C语言
全网最详细用c语言实现植物大战僵尸游戏(下)-1
全网最详细用c语言实现植物大战僵尸游戏(下)
229 0
|
7月前
|
Linux C语言
俄罗斯方块(c语言)
俄罗斯方块(c语言)
|
7月前
|
存储 定位技术 API
c语言——俄罗斯方块
c语言——俄罗斯方块
136 0
|
7月前
|
存储 C语言
【c语言】飞机大战2
【c语言】飞机大战2
55 0
|
7月前
|
C语言
C语言绘制爱心
C语言绘制爱心
90 0
C语言绘制爱心
|
7月前
|
存储 C语言 C++
C语言实战演练之C语言满屏飘字表白代码
C语言实战演练之C语言满屏飘字表白代码
|
C语言
全网最详细用c语言实现植物大战僵尸游戏(上)-2
全网最详细用c语言实现植物大战僵尸游戏(上)
197 0