提升【按位异或】历史地位的一帖。

有一次进入了大脑缺少刺激就会死的状态。
于是开始刷leetcode。
然后刷到了这么一道题:

Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3] return 2.

当然这题的解法还是很明朗的,求和比较一下就可以accepted了。

public int missingNumber(int[] nums) {
    int result = 0;
    for(int i=0; i<nums.length; i++){
        result = result + i + 1 - nums[i];
    }
    return result;
}

然后点开了tag,再一次发现了Bit Manipulation
于是自个儿在那儿琢磨怎么用位运算符
与,或,非应该是没可能了
那就是异或!
总感觉异或这个运算符,有那么一点神奇。
一切都源自于下面这个看起来有点蠢的整数比较方法:

public boolean isEqual(int a, int b){
    return (a^b==0)
}

道理我都懂,按位异或嘛,简单。
可是就是这么简单的一个方法,玩儿法还真的挺多。
于是开了开脑洞。写了下面一段代码:

public int findDifferentOne(int[] a,int[] b){
    int result=0;
    for(int i=0;i<a.length;i++){
        result=result^a[i];
    }
    for(int i=0;i<b.length;i++){
        result=result^b[i];
    }
    return result;
}

目的是找出a在b中唯一没有的那个元素(反过来也一样)
e.g.
a={3,4,7,11}
b={7,11,4}
那findDifferentOne(a,b)的结果就是3

不要跟我说求和一减就可以了!
不要跟我扯哈希!
风太大听不见!
按位异或虽然看上去白痴!
但在寻找差异性方面,按位异或逼格满满不觉得么!
a^b==0
请记住它!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值