转载请注明出处:http://blog.csdn.net/ns_code/article/details/27568975


这篇文章没有代码。介绍的是纯理论的思路。

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示。其运算法则是对运算符两側数的每个二进制位,同值取0,异值取1。

它与布尔运算的差别在于,当运算符两側均为1时,布尔运算的结果为1,异或运算的结果为0。

异或的性质:

1、交换律:a^b = b^a;

2、结合律:(a^b)^c = a^(b^c);

3、对于随意的a:a^a=0,a^0=a。a^(-1)=~a。

了解了上面这些。来看看这个,非常重要。后面的程序都要用到这个结论:

对于随意的a,有a^b^c^d^a^k = b^c^d^k^(a^a) = b^c^d^k^0 = b^c^d^k,也就是说。假设有多个数异或,当中有反复的数,则不管这些反复的数是否相邻。都能够依据异或的性质将其这些反复的数消去。详细来说,假设反复出现了偶数次。则异或后会所有消去。假设反复出现了奇数次,则异或后会保留一个。

以下来看两道题目:

1、1-1000放在含有1001个元素的数组中,仅仅有唯一的一个元素值反复,其它均仅仅出现一次。每个数组元素仅仅能訪问一次,设计一个算法,将它找出来;不用辅助存储空间,是否能设计一个算法实现?

当然。这道题,能够用最直观的方法来做。将所有的数加起来,减去1+2+3+...+1000的和,得到的即是反复的那个数,该方法非常easy理解,并且效率非常高。也不须要辅助空间。唯一的不足时,假设范围不是1000。而是更大的数字,可能会发生溢出。

我们考虑用异或操作来解决该问题。

如今问题是要求反复的那个数字,我们姑且假设该数字式n吧,假设我们能想办法把1-1000中除n以外的数字所有异或两次。而数字n仅仅异或一次。就能够把1-1000中出n以外的所有数字消去,这样就仅仅剩下n了。

我们首先把所有的数字异或,记为T,能够得到例如以下:

T = 1^2^3^4...^n...^n...^1000 = 1^2^3...^1000(结果中不含n)

而后我们再让T与1-1000之间的所有数字(仅包括一个n)异或。便可得到该反复数字n。例如以下所看到的:

T^(a^2^3^4...^n...^1000) = T^(T^n) = 0^n = n

这道题到此为止。

2、一个数组中仅仅有一个数字出现了一次,其它的所有出现了两次,求出这个数字。

明确了上面题目的推导过程,这个就非常easy了,将数组中所有的元素所有异或,最后出现两次的元素会所有被消去,而最后会得到该仅仅出现一次的数字。

该题目相同能够该为例如以下情景,思路是一样的:数组中仅仅有一个数字出现了奇数次,其它的都出现了偶数次。

【剑指offer】异或去重的更多相关文章

  1. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  2. 【剑指offer】数组中仅仅出现一次的数字(1)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描写叙述: 一个整型数组里除了两个数字之外.其它的数字都出现了两次. 请 ...

  3. 剑指offer题解(Java版)

    剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...

  4. 剑指offer二刷(精刷)

    剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次. ...

  5. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  6. [读]剑指offer

    研二的开始找工作了,首先祝愿他们都能够找到自己满意的工作.看着他们的身影,自问明年自己这个时候是否可以从容面对呢?心虚不已,赶紧从老严那儿讨来一本<剑指offer>.在此顺便将自己做题所想 ...

  7. 《剑指offer》全部题目-含Java实现

    1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. publi ...

  8. JS版剑指offer

    介绍 用JavaScript刷完了剑指offer,故总结下每道题的难度.解决关键点,详细题解代码可以点链接进去细看. 关于JS刷题的技巧可以看我之前的这篇:JS刷题总结. 剑指offer的题目在牛客网 ...

  9. 剑指offer题目java实现

    Problem2:实现Singleton模式 题目描述:设计一个类,我们只能生成该类的一个实例 package Problem2; public class SingletonClass { /* * ...

  10. 剑指offer(27)字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入 ...

随机推荐

  1. 剑指Offer(书):链表中环的入口节点

    题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public ListNode EntryNodeOfLoop(ListNode pHead) { //第一步,查找是 ...

  2. 算法学习记录-图——最短路径之Dijkstra算法

    在网图中,最短路径的概论: 两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点. 维基百科上面的解释: 这个算法是通过为每个顶点 v 保留目前为止所找到的从 ...

  3. BZOJ 1831: [AHOI2008]逆序对

    题目大意: 给出一个序列,有几个位置上的数字任意.求最小的逆序对数. 题解: 自己决定放置的数一定是单调不降的.不然把任意两个交换一下就能证明一定会增加逆序对. 然后就可以DP了,f[i][j]表示第 ...

  4. Django之url上的include,URL命名和反向解析,命名空间

    include其他的URLconfs   #At any point, your urlpatterns can “include” other URLconf modules. This #esse ...

  5. 【29】html5新标签有哪些?

    [29]html5新标签有哪些? canvas svg video audio [01]article(IE8不支持) [01]details [02]aside(IE8不支持) [03]header ...

  6. xfce-openvas9

    1安装OpenVas 第一步,添加PPA源,在这我用的是一台新装的Ubuntu安装OpenVas,运行以下命令就可以进行安装 root@ubuntu:~# add-apt-repository ppa ...

  7. 【转载】标准C语言的输入输出流(i/o)方法详解

    标准 C I/O clearerr 语法: #include <stdio.h> void clearerr( FILE *stream ); clearerr函数重置错误标记和给出的流的 ...

  8. 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!

    公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...

  9. 【Luogu】P3455Zip-Queries(莫比乌斯反演)

    题目链接 真是神TM莫比乌斯 首先来看一个神奇的结论:求gcd(x,y)==k的对数,其中1<=x<=n,1<=y<=m 等同于求gcd(x,y)==1的对数,其中1<= ...

  10. Educational Codeforces Round 13——D. Iterated Linear Function(矩阵快速幂或普通快速幂水题)

      D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes input ...