异或的用法:
按位异或,相同为0,相异为1
异或的理解:
举个例子
1、两个5异或,即5^5,因为它们所有二进制位都相同,所以相同为0。
2、0和5异或呢?0^5,由于二进制位中,0和0异或相同为0,1和0异或相异为1,所以0异或5答案还是5
3、再复杂一点,5 5 4 4 3 3 2 2 1 1,这数字全部一起异或,由于两辆异或相同为0,所以一起异或结果是0
4、我添加一个9到上面的数组,5 5 4 4 3 3 2 2 1 1 9,这时候异或会是什么?没错是9,前面两两相同的异或结果是0,最后0和9异或根据2的结论,结果就是9
总结:使用异或可以在数组中找出一个落单的数字,可以称它为单身狗。
异或的应用:
题目:
数组nums包含0到n的所有整数,但是其中缺一个,找出缺失的一个整数。——来着leetcode消失的数字。
思路:1、排序,依次查找,如果下一个数不是上一个数+1,那么上一个数+1就是消失的数字。
O(NxlogN+N),N可以忽略,所以是O(NxlogN);
2、异或
设x=0;把输入的数字全部异或,在把0到numsSize的数字和上面的结果异或,就能得出缺少的。
第一次循环N次,第二次N+1次,O(2N+1),1忽略,2忽略,O(N) 。
int missingNumber(int* nums, int numsSize){
int x= 0;
for(int i = 0;i<numsSize;++i)
{
x ^= nums[i];
}
for(int i = 0;i<=numsSize;++i)
{
x ^= i;
}
return x;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。