1.2 如何找到数组中唯一成对的那个数
题目
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
标签
- 位运算
- 异或
思路
异或运算可以消除重复的数,例如
A ^ A ^ B ^ C ^ C = B
构造1-1000个数的数组(不重复),将其与题目给的1001个数挨个异或,最后剩下的就是要求的那个数
代码
public static void main(String[] args) {
// ===================构造题目所需数组Start===================
int N = 1001;
int[] arr = new int[N];
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = i + 1;
}
//最后一个数,是随机数
arr[arr.length - 1] = new Random().nextInt(N - 1) + 1;
//随机下标
int index = new Random().nextInt(N);
Util.swap(arr, index, arr.length - 1);
Util.print(arr);
// ===================构造题目所需数组End===================
int x1 = 0;
// 构造1-1000的数组
for (int i = 1; i <= N - 1; i++) {
x1 = (x1 ^ i);
}
// 遍历每个数,与题目给定的数组进行异或运算,求得结果
for (int i = 0; i < N; i++) {
x1 = x1 ^ arr[i];
}
System.out.println(x1);
}
总结
题目的重点就是不适用额外空间,如果可以使用,其实也可以准备一个1000长度的数组A,存储给定的数组每个数出现的次数,然后再遍历数组A即可获得结果。
异或解法不仅空间复杂度较低,而且效率更高