题目:
一个数组中只有一个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这个只出现一次的数字。
例如:
有数组元素是:1,2,3,4,5,1,2,3,4
输入:5
代码实现:
解析:
1.首先,需要理解什么是按位取反(^)。
1.1在计算机里,数据都是通过二进制的形式进行储存(0或1)
1.2按位取反(^)。
两数按位取反,相同为0,不同为1。
核心注意:
a^a=0
a^0=a
所有数组元素进行按位异或,成对变0,最后只剩下未成对的单身狗
扩展:假如有两个单身狗呢?
例如:数组arr[10]={1,2,3,4,5,1,2,3,4,5,6}
试用代码寻找出其中的两只单身狗。
代码实现: 思路:
如果存在两个单身狗,那我们就试着将它们分开来寻找,也就是分为两组。
那要怎么样才能将这两只单身狗分别分为两组呢?
在这里我们将所有的元素进行按位异或,也就等于两只单身狗进行按位异或(其他的都成对为0走了)。
接下来,我们要找出这两只单身狗的不同来进行分组。我们回忆起按位异或(^)的功能:二进制按位排列后,相同为0,不同为1。
依靠这一点,我们就只需要在ber(所有元素按位异或的结果)里找出一个1的排列位置就能找到这两只单身狗的“不同点”(在那个位置上两只单身狗分别为0或1),然后进行分组寻找。
我们将运用按位与(&)和右移操作符(>>)的功能:
--------------------------------------------
实现:
通过右移操作符(>>)实现移位寻找“不同点”
如何通过和1进行按位与(&)是否为1,找出“不同点”。
最后,通过ber^dog1得出另一个dog(ber^dog1=dog2^dog2^dog1=dog1)
实现:
完成。
趣味提升:
问:在不创建第三个变量的前提下,用代码实现两数交换。
例如:a=2, b=3。
输出: a=3, b=2
实现:
核心:a^a=0