巧法找出数组中唯一成对的数
题目
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来。(不借助辅助空间)
关于位运算
^ 异或:相当于不进位加法
1+1=0 0+0=0 0+1=1
特点:相同的相异或消除
给与本题思路:将1-1000进行异或运算,再与数组中的数进行异或运算,将数组中仅出现一次的数消除,剩下的就是重复的那个数
代码
import java.util.Random;
public class Hello {
public static void main(String[] args)
{
int N=11;
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);
int temp;
temp=arr[arr.length-1];
arr[arr.length-1]=arr[index];
arr[index]=temp;
for(int i=0;i<N;i++)
{
System.out.print(arr[i]);
}
int x1=0;
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();
System.out.println(x1);
}
}
采用存储空间的思路
int[] helper = new int[N];
for(int i=0;i<N;i++)
{
helper[arr[i]]++;//helper数组的下标代表arr数组中的元素,存储的int值代表元素出现的次数
}