数组中只出现一次的数字

来源:互联网 发布:淘宝网电警棍 编辑:程序博客网 时间:2024/06/04 18:38

题目描述

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

       数组中有两个数字只出现一次,但是其它数字都出现两次,这让我们想到了,整个数组中只有一个数字只出现一次,其它数字都出现两次的题目。如果是这样子的话,利用异或的性质--相同为0,相异为1,把所有数字进行异或就可以得到只出现一次的那个数字了。但是这个题目里面有两个只出现一次的数字,如果能够把它们分成两组,把这个题目转化成两个刚才那个题目就很简单了。

      有两个不同的数字,那么对这个数组中所有的数据进行异或肯定不为0,那我们可以找到不为0的那一位flag,把整个数组分开,所有flag位为1的为一组A,flag为0的为一组B,在相同的数字肯定在同一个组里面,A,B组就转换成那个子问题了,即数组中只有一个数字只出现一次。

class Solution {public:    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {        int length = data.size();        if(length <2)            return ;        int result = 0;        for(int i = 0; i < length; i ++){            result ^= data[i];        }        unsigned int indexOf1 = FindFirstBitIs1(result);        *num1 = *num2 = 0;        for(int i = 0; i < length; i ++){            if(IsBit1(data[i], indexOf1))                *num1 ^= data[i];            else                *num2 ^= data[i];        }                }    unsigned int FindFirstBitIs1(int num){        int indexBit1 = 0;        while((num & 1) == 0 && (indexBit1 < 8 *sizeof(int))){            num = num >> 1;            ++ indexBit1;        }        return indexBit1;    }        bool IsBit1(int num, unsigned int indexBit1){        return (num >> indexBit1) & 1;    }        };


0 0
原创粉丝点击