有一个数组长度为1001,其中只有一个数是重复的,数字范围为1-1000,找出重复的那个数字。
本题可以用异或运算来进行算:如果两个数相同则异或运算的结果为0,0^B结果为B。但是如果直接将这些数进行异或运算的化,正好将重复的消除了,然而,我们却想要得出重复的数据,就需要做两遍异或运算,如下图所示:
这样,就把没有重复的数变成了2个,他们做异或运算结果就为0,然而,重复的数字就会有3个,前两个异或运算为0,那么0^k=k。这样就得到了我们所要的重复的数字。下面将附上C语言代码。
#include <stdio.h>
int main()
{
int a[1001];
for(int i=0;i<1001;i++){
a[i]=i+1;
}
a[1000]=1000;
a[0]=100;
a[999]=1;//给的随机数的部分
int x=0;//让一开始的为0,进行1-1000的异或运算
for(int i=1;i<1001;i++){
x=x^i;
}
for(int i=0;i<1001;i++){
x=x^a[i];
}//再次进行疑惑运算,得到所要结果。
for(int i=0;i<1001;i++){
printf("%d ",a[i]);
}//打印数组中的元素,方便判断是否正确
printf("\n\n\n\n\n%d",x);//输出结果
return 0;
}
以上就是本题的其中一个方法,再有一个方法就是再用一个数组,数组的下标为每个数,当出现一次这个数是,对应下标加一,最后将等于2的那个下标输出即可(该方法比较普通,不做介绍,感兴趣可以自己尝试)。