蓝桥杯算法基础(1):位运算(问题1:如何找到数组中唯一成对的那棵树,java代码)

文章介绍了如何使用位运算(如异或、与、或等)在不使用辅助存储空间的情况下,找出数组中唯一重复的数。通过异或操作消除重复,展示了具体算法实现和结论——异或可以用于数组中的元素去重。
摘要由CSDN通过智能技术生成

//如何找到数组中唯一成对的那棵树

基础知识
位运算符
&(与),|(或),^(异或),~(取反)
 >>和<<运算符将二进制位进行右移或左移操作
 >>>运算符将用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);
    }
}
 }


 

 结论:异或可用于消重

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值