260. Single Number III

一、题目

  1、审题

  

  2、分析

    在线性时间复杂度、常量空间开销的情况下统计出一个整形数组中只出现一次的两个数(其他的数都是出现2次)。

 

二、解答

  1、思路

    ①、对数组所有元素进行异或(^) 操作,得到只出现 1 次的这两个数的异或结果 diff。

    ②、diff &= -diff ,得到只出现一次的两个数的二进制形式的第一个不同的位置 a。

    ③、初始化结果数组{0, 0},遍历数组中的元素,若 a = 1,则与结果数组中第一个元素进行异或;若 a = 0 ,则与第二个元素进行异或。

    ④、返回结果数组。

    public int[] singleNumber(int[] nums) {
        // Pass 1 : 
        // Get the XOR of the two numbers we need to find
        int diff = 0;
        for(int num: nums)
            diff ^= num;
        // Get its last set bit
        diff &= -diff;
        
        // Pass 2 :
        int[] rets = {0, 0};
        for(int num: nums) {
            if((num & diff) == 0)
                rets[0] ^= num;
            else 
                rets[1] ^= num;
        }
        
        return rets;
    }

 

posted @ 2018-11-20 15:43  skillking2  阅读(147)  评论(0编辑  收藏  举报