//如何找到数组中唯一成对的那棵树
基础知识
位运算符
&(与),|(或),^(异或),~(取反)
>>和<<运算符将二进制位进行右移或左移操作
>>>运算符将用0填充高位;>>运算符用符号位填充高位,没有<<<运算符
对于int,1<<35与1<<3是相同的,而左边的操作数是long型时需对右侧操作数模64(int为4个字节,一个字节8个bit位,所以int位32位,35-32=3)
&都为1结果为1
|有一个为1结果为1
^二者不同时结果为1
位运算可解决问题:
1.判断奇偶数
2.获取二进制位是1还是0(两种解决方案)
3.交换两个整数变量的值
4.不用判断语句,求整数的绝对值
题1:找出唯一成对的数
1~1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均只出现一次。
每个数组元素只能访问一个,设计一个算法,将它找出来;不用辅助存储空间,能否设计个算法实现。
//(用异或消除)
public static 唯一成对数{
int N=11;//举个简单的例子
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;
//随机下标
int index=new Random(),nextInt(N);
//自己定义的包
//swap是将两个位置的数交换
//print打印数组中每一个值
Util.swap(arr.index,arr.length-1);
Util.print(arr);
int x1=0;
//相同的数异或位零(1^1=0),(1^0=1)
//(1^2....^1000^随机数)^(1^2^3^....^1000)=随机数
for(int i=0;i<N-1;i++)
{
x1=(x1^i+1);
}
for(int i=0;i<N;i++){
x1=(x1^arr[i]);
}
system.out.println(x1);
//用辅助空间记录每个值出现的次数
int[] helper=new int[N]; for(int i=0;i<N;i++){ helper[arr[i]]++; } for(int i=0;i<N;i++){ if(helper[i]==2){ System.out.println(i); } }
}
结论:异或可用于消重