位运算 找出唯一成对的数

找出唯一成对的数

  1. 问题描述
    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.这一次的学习经验主要是运用了位运算的思想。因为题目限制了不能开辟新的空间,如果忽略这个条件,可以重新定义一个数组,将之前的数组的值对应着新数组的下标,改下表对应的数组的值记录该数字出现的次数

发布了8 篇原创文章 · 获赞 0 · 访问量 229

猜你喜欢

转载自blog.csdn.net/LilyS1/article/details/103964757