面试题40:数组中只出现一次的数字
题目:一个整形数组里除了两个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字。要求时间复杂度为O(N),空间复杂度为O(1)。
分析:利用异或运算可以求出一个整形数组里唯一一个只出现一次的数字。因此,如果能将本题的数组分成两个部分,使得每个部分只包含一个只出现一次的数字,便可以求得本题的解。通过从头到尾依次异或数组中的每一个数字,最终得到的结果为两个只出现一次的数字异或得到的结果。由于这两个数字一定不同,因此其异或得到的结果中必定至少有一位为1。假设第n位为1,那么就可以根据第n位是否为1将原数组分成两个部分。
vector<int> findNumsAppearOnce( vector<int>data ) { vector<int>result; int n = data.size(); if (n==0) return result; int temp = 0; for (int i = 0; i < n; ++i) temp^=data[i]; //查找temp中第一个1出现的位置 unsigned int k = 1; while ((temp&k)==0) k = k << 1;//关系运算符的优先级高于位运算符 //利用k将data分为两个部分int result1 = 0, result2 = 0; for (int i = 0; i < n; ++i) { if ((data[i]&k) == 0) result1^=data[i]; else result2^=data[i]; } result.push_back(result1); result.push_back(result2); return result; }