题目:1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
思路:使用异或,异或可以消除重复的数字。
比如A^A==0,A^0=A,A^A^B^C^C==B
原本数组有重复数,我们使用该数组异或一次不包含重复数该数组
比如:a[4]=1,2,3,3,那么我们就在来一个a[3]=1,2,3,两个进行异或。
public static void main(String []args){
/*1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。
每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?*/
//定义那1001个元素,重复的那个使用随机数生成
int N=1001;
int []a = new int[N];
for (int i=0; i < a.length-1; i++)
a[i] = i+1;
a[a.length-1] = new Random().nextInt(N-1)+1;//随机数是从0到我指定的N随机生成
for (int b:a) {
System.out.printf("%d ",b);
}
System.out.println();
//利用异或
int x=0;
for (int i=1; i <= a.length-1; i++)
x=x^i;
for (int i=0; i < a.length; i++)
x=x^a[i];
System.out.print(x);
}
当然如果题目没有要求不用辅助存储空间,我们还可以使用这种方法。
因为a数组是1-1000,所以我们可以用把a数组值当一个新数组的下标,然后每个下标自增1,当遇见a数组里面有重复的数时,新数组就会自增两次,从而等于2,以此为判断条件找到重复的数并且输出。
//借用辅助空间
int []b = new int[N];
for (int i=0; i < N; i++){
b[a[i]]++;
}
for (int i=0; i < N; i++){
if(b[i]==2) {
System.out.print(i);
break;
}
}