找出唯一成对的数
- 问题描述
1-1000这1000数存放在含有1001个数放在1001个元素的数组中,只有唯一的一个元素之重复,其他均只出现一次。每个数组的元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间
2.思路
使用位运算的异或运算,因为只有一对数据重复,将1001长度的数组和1000长度的数组异或,最后得到的是重复的数,也就是要求的数。可以先使用小数据测试一下
(1234…x…1000x)(123…1000)=x
3.主要代码如下
public class NumberOfUniquePairs {
/**
* @param args
*/
public static void main(String[] args) {
//int n=11;//测试先使用小数据
int n=1001;
int[] array=new int[n];
for(int i=0;i<n;i++){
array[i]=i+1;
}
Random random=new Random();
//数组的最后一个存储随机数字,该数字是1-1000中的任意一个,因为random随机产生的数从0开始,不包括n,所以最后加一
array[n-1]=random.nextInt(n-1)+1;
//产生随机下标,为了让这一地数据随机分布 index 的取值范围是0-1000
int index=random.nextInt(n);
//交换数组的最后一个位置(也就是随机产生的数字的下标)和随机产生的下标,确保重复的数据随机
swap(array,index,array.length-1);
//输出这个数组
for(int i=0;i<n;i++){
System.out.print(array[i]+" ");
}
System.out.println();
//因为要进行异或运算,不能开辟新空间,可以先将1-1000进行异或,首先领X1=0,因为任何数和0异或都是本身
int x1=0;
for(int i=1;i<=n-1;i++){
x1=x1^i;
}
//将得到的异或之后的X1再次和数组异或
for(int i=0;i<n;i++){
x1=x1^array[i];
}
System.out.print(x1);
}
public static void swap(int[] array,int index1,int index2){
int temp;
temp=array[index1];
array[index1]=array[index2];
array[index2]=temp;
}
}
4.这一次的学习经验主要是运用了位运算的思想。因为题目限制了不能开辟新的空间,如果忽略这个条件,可以重新定义一个数组,将之前的数组的值对应着新数组的下标,改下表对应的数组的值记录该数字出现的次数