使用异或运算交换整型

异或运算

相同为0,不同为1 ^

满足交换律和结合律

int a = 17;
int b = 20;
// 交换a ,b 
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 第一行代码: a = 17^20; b = 20;
// 第二行代码: a = 17^20; b = 17^20^20;
// 第三行代码: a = 17^20^17; b = 17^20^20;
// 根据相同为0;a=20;b=17;

异或交换
面试题目:
找出数组中奇数次的数 要求O(N) 空间 N(1)

    public void printOddTimesNum1(int [] arr){
        int eor = 0;
        for(int cur:arr){
            eor^=cur;
        }
        System.out.println(eor);
    }

找出数组中两个奇数次的数 要求O(N) 空间 N(1)

  public void printOddTimesNum2(int[] arr) {
        int eor = 0;
        for (int cur : arr) {
            eor ^= cur;
        }
        // eor = a ^ b;
		// 这里面先取反加一 找到最右边的第一个不通过的位
        int rightOne = eor&(~eor+1);
        int onlyOne = 0;
        // 这里得到 a 或者 b其中的一个
        for (int cur : arr){
        	// 如果位数为零的数进行异或,得到其中一个数
            if((cur & rightOne) == 0){
                onlyOne ^=cur;
            }
        }
        // 对eor^onlyOne = a^b^b 得到 第二个数
        System.out.println("第一个是:"+(eor^onlyOne)+"第二个是"+onlyOne);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值