找出唯一成对的数
1—1000这1000个数放在1001个元素的数组中,只有唯一的一个元素值重复,
其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;
不能用辅助存储空间,能否设计一个算法实现?
import java.util.Random;
public class A_001 {
/*
* 题1:找出唯一成对的数
* 1—1000这1000个数放在1001个元素的数组中,只有唯一的一个元素值重复,
* 其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;
* 不能用辅助存储空间,能否设计一个算法实现?
*/
public static void main(String[] args) {
int N = 1001;
int[] arr = new int[N];
for (int i = 0; i < arr.length - 1; i++) { //填充数组
arr[i] = i + 1;
}
//在数组最后位置生成一个随机数
//Random().nextInt(N) 生成0~N的随机数,不包括N
//Random().nextInt(N-1) + 1 确保不包括0和N
arr[arr.length - 1] = new Random().nextInt(N-1) + 1;
int index = new Random().nextInt(N); //生成一个随机下标
System.out.println(index);
//交换位置
int box = arr[index];
arr[index] = arr[arr.length - 1];
arr[arr.length - 1] = box;
for (int i = 0; i < arr.length; i++) { //输出数组
System.out.print(arr[i] + " ");
if((i + 1) % 30 == 0)
System.out.println();
}
//利用(A^B^C^C^B = A)的原理消除重复
int x1 = 0; //用x1储存数组异或的总和
for (int i = 0; i < N; i++) {
x1 = x1 ^ arr[i];
}
int x2 = 0; //用x2储存1~1000异或的总和
for (int i = 1; i < N; i++) {
x2 = x2 ^ i;
}
int a = x1 ^ x2;//数组异或的总和 ^ 1~1000异或的总和 得出 重复值
System.out.print("\n" + a);
}
}
271

被折叠的 条评论
为什么被折叠?



