1.题目描述:
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
2.解题技巧:
原理:设重复的数为repeat 将1~1000的数变成X1=(1^2^3...^1000) 然后再跟arr数组里面的所有的数进行异或,x1^(1^2^...^repeat)相当于下面的情况: (1^2^3...^1000)^(1^2^...^repeat)
因为异或的原理是相同为0,相异为1。所以结果1^1=0、2^2=0....1000^1000=0、repeat^0=repeat。 又因为repeat的范围为1~1000,不可能为0,异或后的结果为repeat,直接返回就行了。
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6};
int N = arr.length;//N=1001
// 方式一:
int x1 = 0;
// 先将 1~1000 的两两异或,得到 x1
for (int i = 1; i <= N - 1; i++) {
x1 = x1 ^ i;
}
// 将 x1 与 arr数组 中的每个值异或
for (int i = 0; i < N; i++) {
x1 = x1 ^ arr[i];
}
System.out.println(x1);
System.out.println("===========");
// 方式二:辅助空间
int[] helper = new int[N];
//1-1000;
for (int i = 0; i <= N - 1; i++) {
helper[arr[i]]++;
}
//1-1000
for (int i = 1; i <= N - 1; i++) {
if(helper[i] == 2) {
System.out.println(i);
break;
}
}
}