码农小汪剑指Offer之38-数组中只出现一次的数字 异或运算的运用

原创 2016年04月09日 23:02:51

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路

这道题,看上去没啥的,其实真实的很难,如果你从未接触过,一般情况下多数都是无法搞定这个问题的,不好解决!如果可以使用HashMap那么还需要你来解决?

这道题考的是异或运算,而且增加了难度!
从题目可以知道,其他的数字都是有两个的,对吧!只有其中的两个数字不一样!两个数字不一样的话,异或肯定存在区别的。至于区别 在何处,我们慢慢的到来

a 异或 b
按位异或

a 为 5 — 0101
b 为 7 —-0111
____
0010
对应位相同为0, 不同为1
因为,有两个不同的数字,一定存在有一位不一样的,而且不一样的,位肯定为1,我们只要找到不一样的位置在哪里就晓得了。

还有个性质没有讲,两个相同的数字异或为0。那么我们首先将所有的数字异或之后。就剩下两个不同数字异或的结果。让后寻找不一样的位置就好了。这样就可以解决问题!
这样就造成了,在某一位上肯定会出现一个为0
一个为1。

if (array.length < 2) {
            return;
        }
        int result = 0;

        for (int i = 0; i < array.length; i++) {
            result ^= array[i];
        }

找到不同的位置

        int flag = 1;
        // 我们找到不一样的第一位
        int j = 1;
        while (true) {
            if ((result & j) == 1) {
                break;
            }
            result = result >> 1;//比较最低位是否为不同的那一位!
            flag = flag << 1;
        }

分为两个数字,因为flag&这两个不同的数字,一定可以区分出来,这两个数字,其他的任意来啦!随便他们放在哪边,总会出现为异或为0的结果,对于最后的值没有影响!

        num1[0] = 0;
        num2[0] = 0;
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & flag) == 0) {
                num1[0] ^= array[i];
            } else {
                num2[0] ^= array[i];
            }
        }

完整代码:

package JianzhiOffer;

public class Slution37 {

    public static void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {

        if (array.length < 2) {
            return;
        }
        int result = 0;

        for (int i = 0; i < array.length; i++) {
            result ^= array[i];
        }
        int flag = 1;
        int j = 1;
        while (true) {
            if ((result & j) == 1) {
                break;
            }
            result = result >> 1;
            flag = flag << 1;
        }
        num1[0] = 0;
        num2[0] = 0;
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & flag) == 0) {
                num1[0] ^= array[i];
            } else {
                num2[0] ^= array[i];
            }
        }
    }
}

http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

版权声明:码农小汪,欢迎交流 QQ:983433479

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

思路:上篇博文中已经了解到异或去重的原理,而且知道如果只有一个只出现一次的数字的求法,但这里是有两个只出现一次的数字,我们便要想办法把他分为两个子数组,每个子数组中包含一个只出现一次的数字,其他的数字...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月31日 08:59
  • 3947

剑指offer:数组中只出现一次的数字(java)

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请些程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).     如输入数组{2,4,3,6,3,2,5,...
  • abc7845129630
  • abc7845129630
  • 2016年10月06日 19:03
  • 1096

剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

腾讯 2015秋招 编程题4:微信红包中个数超过总数一半的红包金额 题目描述 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一...
  • yanglr2010
  • yanglr2010
  • 2016年05月14日 22:24
  • 1209

码农小汪剑指Offer之36-二叉树的深度 层次遍历 分而冶之

题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路我已看到这个题目的时候,就想到了利用分冶的方法,利用递归的思路。...
  • u012881904
  • u012881904
  • 2016年04月05日 17:02
  • 316

剑指offer 编程题(38):数组中只出现一次的数字

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。class Solution { public: void FindNumsAppearOnce(v...
  • coolwriter
  • coolwriter
  • 2017年12月25日 18:26
  • 44

异或的应用 及剑指offer 面试 40 数组中只出现一次的数字

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27568975     这篇文章没有代码,介绍的是纯理论的思路。  ...
  • haluoluo211
  • haluoluo211
  • 2014年12月26日 21:01
  • 469

剑指offer——数组中只出现一次的数字(好题,熟悉位运算)

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路:...
  • qqqqq1993qqqqq
  • qqqqq1993qqqqq
  • 2017年06月27日 17:07
  • 147

剑指Offer系列-面试题38:数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。 思路:二分查找该数字第一次出现的位置,然后找最后一次出现的位置,相减即可。用二分查找,时间复杂度为O(log n)。 代码:public int G...
  • Alone_Rojer
  • Alone_Rojer
  • 2017年03月15日 22:23
  • 94

剑指offer 38---数字在排序数组中出现的次数

题目: 统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5};和数字3,由于3在数组中出现了4次,因此输出4. 思路: 时间复杂度:           ...
  • weixin_36125166
  • weixin_36125166
  • 2017年08月08日 14:40
  • 369

剑指offer 面试题38 数字在排序数组中出现的次数

剑指offer 面试题38 数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数。例如输入排序数组 {1,2,3,3,3,3,4,5} 和数字 3, 由于 3 在这个数组中出现了 ...
  • liyazhou0215
  • liyazhou0215
  • 2017年06月01日 13:51
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:码农小汪剑指Offer之38-数组中只出现一次的数字 异或运算的运用
举报原因:
原因补充:

(最多只允许输入30个字)