C语言中我对按位异或这种运算不太懂,通过这道题熟悉了一些相关的运算以及基本性质。
题目如下:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,请找出这两个数字。
首先对于这样一道题我是具体化分析比如这个数组就是{1,3,5,7,1,3,5,9},题目要求即找出只出现一次的数字即7和9。
之前在异或那边看过这样一道题,也算是这题目的简单版本,一个数组里面只有一个数字出现一次,其他都出现两次,请找出这个数字。如何解决这样一道题?我之前想法就是用循环多次遍历,选出一个数比如叫a,再在剩下的数字里面遍历看是否有a相等的数字。这个比较繁琐,我们可以考虑用异或的性质解决,一个数字异或它自己结果为0,异或0结果为它自己即a^a=0,a^0=a,且异或满足a^b^c=a^(b^c)。因此我们可以设置一个ret异或每个数组元素,最后相同的都抵消为0,那个唯一的数字异或0为它自己即为答案。
代码如下:
int find_num_once(int a[], int n)
{
int i = 0;
int ret = 0;
for (i = 0; i <