数组中只出现一次的数字

来源:互联网 发布:凌波城静脉不动的算法 编辑:程序博客网 时间:2024/06/11 01:29

题目

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

思路

先考虑如果只有一个只出现一次的数字的情况,这个很简单,只需要把所有的数字异或一遍,所有出现了两次的数字都会异或抵消掉,剩下的就是这个单独的数字了。
考虑有两个只出现一次的数字,把所有的数字都异或一遍,这样得到的结果是这两个只出现了一次的数字异或的结果,现在只需要把这两个数字分开到两组元素里面区分开来异或就可以了,利用之前异或的结果,扫描所有元素,从头开始扫描元素,如果这个元素和之前异或的结果的最后一个1相与是1的话,把它分到一组,不是1就分到另外一组,然后对这两个组分别异或,就分别得到了结果。

参考代码

class Solution {public:    void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {        int temp = 0, ans1 = 0, ans2 = 0;        for (auto num : data) {            temp ^= num;        }        temp = (temp & (-temp));        for (auto num : data) {            if (num & temp) {                ans1 ^= num;            } else {                ans2 ^= num;            }        }        *num1 = ans1;        *num2 = ans2;    }};
原创粉丝点击