[leetcode] 260. Single Number III 解题报告

题目链接:https://leetcode.com/problems/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.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [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?

思路:前面做了只有一个出现一次的数,其他都是出现两次,思路和那题一样。只是这个先将所有数一起异或,然后得到的结果将是两个只出现一次数的异或。然后再检查这个结果的哪一位为1,则说明只出现一次的两个数在这一位肯定不想等。然后就可以根据与这个数相与是否为0将数组分为两半,则这两个只出现一次的数比如分别在这两个数组中。这样问题就回到了上题的思路,只要让子数组内元素全部异或一下,得到的两个数就是最终要的只出现一次的数。

代码如下:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        if(nums.size() == 0) return result;
        int val = 0, val1 = 0, val2 = 0;
        for(int i = 0; i< nums.size(); i++)//所有数异或之后的值将是两个不想等数的异或
            val = val^nums[i];
        int k = 1;
        while((k&val) != k)//找到第一个为1的位所在的位置k
            k = k<<1;
        for(int i = 0; i< nums.size(); i++)//将数组分为两个部分
        {
            if(nums[i]&k)//第一部分是与k位为1的数
                val1 = val1^nums[i];
            else//第二部分是k位为0的数
                val2 = val2^nums[i];
        }
        result.push_back(val1);
        result.push_back(val2);
        return result;
    }
private:
    vector<int> result;
};


你可能感兴趣的:(LeetCode,算法,bit,manipulation)