IMWeb提升营Day7 | 训练题40:数组中只出现一次的数字

来源:互联网 发布:project软件 编辑:程序博客网 时间:2024/06/07 10:07

题目描述

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

思路

/* * 思路:第一反应是哈希表,第一遍遍历数组完善哈希表,第二遍遍历数组对应的哈希表值找只出现一次的数字 * 但是哈希表的空间开销太大了,毙掉! * 仔细观察题目,会发现其他数字都出现了两次,咦这题目怎么这么熟悉 * 有个关键的知识点:A 异或 A = 0, A 异或 0 = A * 所以我们肯定能求出这两个数的异或值 * 再根据这个值里出现1的那一位,就能把数组分成两部分,每一部分都是一个子问题,只包含一个只出现一次的数字,其他的都是出现两次的 */class Solution {public:    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {        int len = data.size();        if(len <= 1) { *num1 = 0; *num2 = 0; return;}        int XORdata = 0;        for(int i = 0; i < len; i++){            XORdata ^= data[i];        }        int test = 1;        while((XORdata & 1) != 1){            XORdata >>= 1;            test <<= 1;        }        vector<int> data0;        vector<int> data1;        for(int i = 0; i < len; i++){            if(data[i] & test) data0.push_back(data[i]);            else data1.push_back(data[i]);        }        *num1 = 0;        *num2 = 0;        for(int i = 0; i < data0.size(); i++){            *num1 ^= data0[i];        }        for(int i = 0; i < data1.size(); i++){            *num2 ^= data1[i];        }    }};