有一次进入了大脑缺少刺激就会死的状态。
于是开始刷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
请记住它!