leetcode [260] - Single Number III

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

Example:

Input:  [1,2,1,3,2,5]
Output: [3,5]

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.

  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity

题目大意:

  给定数组中只有两个元素只出现一次,其余元素均出现两次,找到这两个元素。

  要求算法具备线性时间复杂度。

理  解:

  已知异或运算,两数相同异或为0。则将数组所有数异或的结果即为两不同元素异或的结果,选取非0的最低位,两个元素在该位一定有个数为1,有个数为0.

  根据该非0位划分,将数组分为两部分,则两部分异或的结果即为两个不同的元素。

代  码 C++:

  

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int len = nums.size();
        vector<int> res;
        if(len==2){
            res.push_back(nums[0]);
            res.push_back(nums[1]);
        }
        if(len<=3 || len&1==1) return res;
        int xor1=0;
        for(int i=0;i<len;++i){
            xor1 = xor1^nums[i];
        }
        int index = 1;
        while(xor1!=0){
            if(xor1&1==1){
                break;
            }
            xor1 = xor1 >> 1;
            index++;
        }
        int xor2=0,xor3=0;
        int isOne=1;
        while(index>1){
            isOne = isOne*2;
            index--;
        }
        for(int i=0;i<len;++i){
            int flag = nums[i]&isOne;
            if(flag==0){
                xor2 = xor2^nums[i];        
            }
            else{
                xor3 = xor3^nums[i];
            }
        }
        res.push_back(xor2);
        res.push_back(xor3);
        return res;
    }
};

 

posted @ 2019-05-25 13:11  lpomeloz  阅读(103)  评论(0编辑  收藏  举报