一、位运算的奇巧淫技
题1:找出唯一成对的数
1~1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
import java.util.Random;
public class 唯一成对的数 {
public static void main(String[] args) {
int N = 11; //可以是101,1001,...
int[] arr = new int[N];
// 数组中依次放入数字1~10
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = i + 1;
}
// 最后一个数设置为随机数,注:Random().nextInt(100)为0~99之间的随机整数
arr[arr.length - 1] = new Random().nextInt(N - 1) + 1;
// 输出显示
for (int i = 0; i <= arr.length - 1; i++) {
System.out.print(arr[i] + " ");
}
// 0^0=0 0^1=1 1^1=0
// 1到10经过和本身的异或,会消除掉。剩下重复的数字
int x1 = 0;
for (int i = 1; i <= N - 1; i++) {
x1 = x1 ^ i;
}
for (int i = 0; i <= N - 1; i++) {
x1 = x1 ^ arr[i];
}
System.out.println();
System.out.print("重复的数字是" + x1);
}
}

浙公网安备 33010602011771号