题目:数组中只出现一次的两个数字
描述
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
示例1
输入:
[1,4,1,6]
返回值:
[4,6]
说明:
返回的结果中较小的数排在前面
- 数组全部元素异或。因为有两个元素不等,所以相同数字相消,结果一定不为0
- 找到右边第一个不相等的位,即异或结果右边第一个1,并设置一个变量 t ,只有该位为1
- 数组均异或 t ,结果为0的为一组,大于0的为一组。可以将数组中两个不相等的数字分开
- 再将两组分别异或可以获取两个数。
- 比较大小放入结果数组即可
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
vector<int> n1;
vector<int> n2;
vector<int> res;
int val1,val2;
int len = array.size();
int num = array[0];
int t = 1;
int i;
for(i=1 ; i<len ; i++)
num ^= array[i];
while((num & 1) == 0)
{
num >>= 1;
t <<= 1;
}
for(i=0 ; i<len ; i++)
{
if((array[i]&t) == 0)
n1.push_back(array[i]);
else
n2.push_back(array[i]);
}
val1 = n1[0];
for(i=1 ; i<n1.size() ; i++)
val1 ^= n1[i];
val2 = n2[0];
for(i=1 ; i<n2.size() ; i++)
val2 ^= n2[i];
if(val1 > val2)
{
res.push_back(val2);
res.push_back(val1);
}
else
{
res.push_back(val1);
res.push_back(val2);
}
return res;
}
};