位运算(异或)求数组中出现过奇数次的1种与2种数

位运算是比算数运算快得多的一种运算方法

package algorithm.sort;

public class Operation {
    public static void main(String[] args) {
        //数组中只有一种数出现奇数次,其他的数出现偶数次, 问这个奇数次的数是
        int [] arr=new  int[]{1,2,3,1,2};
        Judge(arr);


        //数组中有两个数出现奇数次,其他的两个数均出现偶数次
        int [] arr1=new int[]{1,2,3,3};
        Judge1(arr1);

    }
    public static void Judge(int [] arr){
        int eor=0;
        for (int cur : arr){
            eor^=cur;
        }
        System.out.println(eor);
        //思路就是将每一个数组中的数据与eor进行一次位运算  就可以实现 让eor等于出现奇数次的数值
    }
    public static void Judge1(int [] arr1){
        int eor=0;
        for (int cur : arr1){
            eor^=cur;     //这个时候进行完成或与运算之后 得到的是   a^b   题意两个数不相同 所以
        }
        //取一个数   位中的最后一个1
        int rightNum=eor & (~eor+1);   //本身 与   (本身取反加1)    得到的是 位中最后一个1

        //由于a^b!=0     所以  取一个1的位置 作为二者的分界   将 a 与b 分隔开

        //在创建一个变量
        int eor1=0;
        for(int cur:arr1){
            if((cur & rightNum)==0){
                eor1^=cur;

            }

        }
        System.out.println(eor1);
        System.out.println(eor1^eor);
        
        //成功的将数据取出


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值