数组中只出现一次的数字★★

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
 
解题思路:
思路一:
常规思路,用map记录所有数字出现的次数,找到只出现1次的数字。
思路二:
思路清奇,使用异或运算。由于除了两个数字不同外,其他都是成对出现的,那么将所有数字进行异或以后,这个数字其实就是两个不同数字的异或结果。
我们找到这个数字最低位为1的位置为p,然后遍历所有数字,判断其他数字位置p是否为1进行区分,然后将为1的数字异或累计、将为0的数字异或累计。
最后的结果就是所求两个数字。
class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int n = data.size();
        if(n < 2) return ;
        int num = data[0];
        for(int i=1; i < n; i++){
            num = num ^ data[i];
        }
        if(num == 0) return ;
        int idx = 0;
        while((num & 1)==0){
            idx++;
            num = num >> 1;
        }
        *num1=0;
        *num2=0;
        for(int i = 0; i < n; i++){
            if(((data[i]>>idx)&1) == 0){    
                //这里判断0与1都可以,只是为了区分而已
                *num1 ^= data[i];
            }else{
                *num2 ^= data[i];
            }
        }
    }
};    

  

 
posted @ 2019-04-10 15:45  tcgoshawk  阅读(365)  评论(0编辑  收藏  举报