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

标签: 位运算
334人阅读 评论(0) 收藏 举报
分类:

题目描述

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

解题思路

这道题,看上去没啥的,其实真实的很难,如果你从未接触过,一般情况下多数都是无法搞定这个问题的,不好解决!如果可以使用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

查看评论

(经典的异或技巧)数组中只出现一次的数字 (两种方法)

数组中只出现一次的数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法一: 采用异或运算 (算是标准的思路吧) 思路: 此题考察...
  • hyqsong
  • hyqsong
  • 2015年10月27日 10:38
  • 2793

剑指offer—数组中只出现一次的数字

继续进行今天的每日一题的:面试题40:题目:一个整形数组里出了两个数字之外,其他的数字都出现了两次。请从程序中找出这两个只出现一次的数字。要求时间的复杂度为O(n),空间复杂度是O(1)。这一道题,比...
  • qq_26768741
  • qq_26768741
  • 2016年05月12日 23:26
  • 760

利用“异或”处理数组的相关算法的几个例子

例1,寻找数组中丢失的数。。。 有一组数字,从1到n减少了一个数,顺序也被打乱了,放在一个n-1的数组里,请找出丢失的数字。 在上一篇“数组公式相关算法”里介...
  • daomihuihui
  • daomihuihui
  • 2015年07月06日 22:57
  • 2954

数组中两个元素异或求最大值

给一个整数数组,求数组中两个元素异或的最大值. 思路:naive的做法是两两异或求最大值,时间复杂度为O(n*n),但是还有一种O(n)的解法,利用字典树Trie来实现. 其思路是利用数组...
  • qq508618087
  • qq508618087
  • 2016年09月28日 22:56
  • 2493

其他数字都是成对出现,找出唯一单独出现的数字------强大的异或

特别要求(使用位运算),这其实是个提示 找到一个不同的数字,正常思维就是拿出一个来依次比较么,找到一样的就找下一个,找不到就是你了, 要求用位运算,想了半天,那把‘==’用‘!’和‘^’组合用么,相同...
  • mzx1317557721
  • mzx1317557721
  • 2017年04月14日 11:00
  • 225

用异或实现查找只出现一次的数字

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,请找出这两个数字。...
  • xy913741894
  • xy913741894
  • 2016年08月07日 21:28
  • 1841

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

题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路这道题,看上去没啥的,其实真实的很难,如果你从未接触过,一般情况下多数都是无法搞定这个问题的...
  • u012881904
  • u012881904
  • 2016年04月09日 23:02
  • 334

剑指offer—数组中只出现一次的数字

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/10/5题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解析: 数组中只...
  • zhangzhengyi03539
  • zhangzhengyi03539
  • 2015年10月05日 21:32
  • 261

剑指offer面试题40-数组中只出现一次的数字

题目: 一个整形数组里除了两个数字意外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 要求时间复杂度是On,空间复杂度为O1 这个是上一篇 2016阿里巴巴java笔试题 的...
  • q291611265
  • q291611265
  • 2015年08月31日 13:51
  • 1430

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

思路:上篇博文中已经了解到异或去重的原理,而且知道如果只有一个只出现一次的数字的求法,但这里是有两个只出现一次的数字,我们便要想办法把他分为两个子数组,每个子数组中包含一个只出现一次的数字,其他的数字...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月31日 08:59
  • 4138
    个人资料
    持之以恒
    等级:
    访问量: 40万+
    积分: 6752
    排名: 4367
    我的QQ