1-1000这1000个数放在含有1002个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将他找出来;不用辅助空间,能否设计一个算法实现。
异或法
设重复数字为A,其余N-2个数字异或为B,N个数字异或为A^B,前N-1个数字异或为A^A^B,由异或的性质可得(A^B)^(A^A^B)=A。所以代码如下:
#include <stdio.h> #include <stdlib.h> #define random(x)(rand()%x) #define N 1001 int arr[N]; int main() { for (int i = 0; i < N-1; i++) { arr[i] = i + 1; } arr[N - 1] = random(1000)+1; //最后一个数是随机数 int x = 0; //A^A^B for (int i = 0; i < N; i++) { x ^= arr[i]; } //A^B for (int i = 0; i < N - 1; i++) { x ^= arr[i]; } printf("%d\n", x); return 0; }