一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
自己对知识使用的灵活性不够...
如果只有一个只出现一次的数字直接异或就可以了,但两个怎么办呢?
后来看得答案:先异或一遍最后的数字是这两个不一样的数字异或的结果。那么这个异或数字为1的位一定是这两个数字不同的位。我们找到一个不同位做标准,把数字分成两组,这样两个只出现一次的数字就分开了。
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { if(data.size() < 2) return; int n1 = 0, n2 = 0; int myxor = 0; int firstOne = 1; for(int i = 0; i < data.size(); i++) //所有数字异或 消去相同数字 myxor ^= data[i]; while((myxor & firstOne) == 0) //从最低位开始,找到一个myxor中是1的位 firstOne = firstOne << 1; for(int i = 0; i < data.size(); i++) //根据找到的那一位是否为1把原数组分为两个,把两个数字分别找到 { if((data[i] & firstOne) == 0) n1 ^= data[i]; else n2 ^= data[i]; } *num1 = n1; *num2 = n2; }