好好的利用异或可以产生神奇的效果。
异或运算的性质:
任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的数字全部在异或中抵消掉了。
例题:
给定大小是N的数组,数组里的元素互相不重复,元素的大小范围是1~(N+1),目标是找出第一个miss的数。要求时间复杂度O(N),空间是O(1)....
分类:
编程语言 时间:
2015-04-02 16:29:18
阅读次数:
200
存在一个数组,该数组中仅有一个数仅出现了一次,其他所有数均出现两次,求这个数 思路:任何一个数和自身求异或操作都是0,任何一个数和0求异或操作都是它自身 class Solution {public: int singleNumber(int A[], int n) { int res=0; for...
分类:
其他好文 时间:
2015-04-01 14:58:29
阅读次数:
124
虽说是暴力题,但还是有很多很多的技巧与细节。 这题: 1、熟悉了位运算符,感觉异或操作的逼格有高了一级 2、可以用一个数的2进制来表示集合(这个需要多用) 3、中途相遇法。。。其实就是把总的集合拆成两半,降低指数使得暴力可解。(前段时间的中南校赛,好像也有个这种方法的题) #inclu...
分类:
其他好文 时间:
2015-01-24 15:42:27
阅读次数:
140
题解:异或操作是每一位独立的,所以我们可以考虑每一位分开做。假设当前正在处理第k位那令f[i]表示从i到n 为1的概率。因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元。若有边i->j 权值为w,若w的k位为0,则f[i]+=1/du[i] * f[j],否则f[i]+=(1-f[j])/...
分类:
其他好文 时间:
2015-01-19 19:00:37
阅读次数:
143
在面试中,经常会问到“如何不用中间变量交换两个变量值”。看看下面这个代码输出是什么:int x = 1984;int y = 2001;x^=y^=x^=y;System.out.println("x="+x+";y="+y);看上去应该很完美的:x=2001;y=1984实际输出是:x=0;y=1...
分类:
编程语言 时间:
2015-01-02 22:23:55
阅读次数:
312
//题目的链接http://www.nocow.cn/index.php/Translate:USACO/hamming/*【位运算】+【异或操作】*//*ID:zhangsh35PROG:hammingLANG:C++*/#include<iostream>#include<math.h>#include<stdio.h>usingnamespacestd;constintMAXN=64;intham[MAXN];inttot,Max,di..
分类:
其他好文 时间:
2014-12-14 18:47:51
阅读次数:
165
最近看了博客园的很多应届生面试bae成功的经历,由衷的佩服和满满的感叹:付出总有回报。于是自己也心痒痒想找几分面试题目做做。无意间看到了这道题目。一个数组存放了2n+1个整数,其中有n个数出现了2次,1个数出现了1次,找出出现1次的数是多少?我想了很久没想出来,可见我很笨,百度了下答案,说只要对所有...
分类:
编程语言 时间:
2014-10-16 12:03:32
阅读次数:
252
大家都知道,假如有a,b两个整型数,我们可以用
a^=b;
b^=a;
a^=b;
来交换a,b的值,在这里我说说其中的原理:
^ 在 C 里面是按位异或操作符,相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:
a = 0101 (5 的二进制表示)
b = 1100 (12 的二进制表...
分类:
其他好文 时间:
2014-09-22 14:10:22
阅读次数:
203
1 /*确定需要改变几个位,才能将整数A转变为整数B 2 * 找出两个数之间位有哪些不同,可以使用异或操作即可 3 * 在异或操作的结果中,每个1都代表A和B相应位是不一样的 4 * 因此只要数一数异或之后又几个位为1就可以知道需要改变几个位 5 * 6 * */ 7 public c...
分类:
其他好文 时间:
2014-09-15 15:46:49
阅读次数:
121
异或操作的作用: 异或 两个不相同,返回true, 两个相同返回false
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0...
分类:
其他好文 时间:
2014-09-11 23:59:42
阅读次数:
495