1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
使用异或方法
不推荐使用遍历一遍减去(1~1000高斯求和),数字大了之后会出现溢出。所以异或是最快速的方法。
解题思路:相同数异或为0,x^0=x;
不使用辅助空间解法:
以及使用辅助空间解法:
public class WeiYiChengDuiShu {
public static void main(String[] args) {
int n = 1001;
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
//生成一个随机数
arr[arr.length - 1] = new Random().nextInt(n - 1) + 1;
System.out.println(Arrays.toString(arr));
int x = 0;
for (int i = 1; i < n; i++) {
x = (x ^ i);
}
for (int i = 0; i < arr.length; i++) {
x = x ^ arr[i];
}
System.out.println(x);
System.out.println("============");
//使用辅助空间
int[] helper = new int[n];
for (int i = 0; i < n; i++) {
helper[arr[i]]++;//这里面的arr[i]是上面赋值的1-1000
}
for (int i = 0; i < n; i++) {
if (helper[i] == 2){//这里的2,是指出现两次
System.out.println(i);
}
}
}
}