落单的数 III-LintCode

来源:互联网 发布:照片编辑美化软件 编辑:程序博客网 时间:2024/05/16 06:18

给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
样例:
给出 [1,2,2,3,4,4,5,3],返回 1和5
挑战:
O(n)时间复杂度,O(1)的额外空间复杂度
思路:
按照“落单的数”第一题的方法,我们可以轻松的到要求的两个数的异或值(Xor),关键在于如何把两个数字拆分出来。我们知道,在Xor中值为1的位,两个数在这个位置上,值是不同的。不妨早最小的位置k,可以把原数组划分为两类,k位置的值为1,与k位置的值为0。借鉴第一题的方法,将这两类数字分别与Xor异或,得到的两个数字即为所求。

#ifndef C84_H#define C84_H#include<iostream>#include<vector>using namespace std;class Solution {public:    vector<int> singleNumberIII(vector<int> &A) {        // write your code here        int num=0,k=0;        int num1=0, num2=0;        vector<int> v;        for (int i = 0; i < A.size(); ++i)        {            num ^= A[i];        }        for (int i = 0; i < 32; ++i)        {            if (num&(1 << i))            {                k = i;                break;            }        }        for (int i = 0; i < A.size(); ++i)        {            if (A[i] & (1 << k))                num1 ^= A[i];            else                num2 ^= A[i];        }        v.push_back(num1);        v.push_back(num2);        return v;    }};#endif
原创粉丝点击