一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
思路一:map啊 肯定用map啊超简单的;需要额外的空间;
思路二:
- 异或操作;先全体异或 求出异或的结果,按照第一个为1的位数 分为两部分 为1的one;与不为1的zero数组;
- 再从每一个数组中求出只出现一次的那个数;
代码:
class Solution {
public:
//未通过的代码:不知道原因;
/*void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
{
vector<int>res;
unordered_map<int,int>map;
for(auto i:data)
map[i]++;
for(int i=0;i<data.size();i++)
if(map[data[i]]==1)
res.push_back(data[i]);
*num1=res[0];
*num2=res[1];
}
*/
int firstBits1(int nums)
{
int index=0;
while((nums&1)==0)
{
nums>>=1;
index++;
}
return index;
}
bool isBits1(int num,int index)
{
return num&(1<<index);
}
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
{
vector<int>one,zero;
int result=0;
for(auto i:data)
result^=i;
int first=firstBits1(result);
for(int i=0;i<data.size();i++)
{
if(isBits1(data[i],first))
one.push_back(data[i]);
else
zero.push_back(data[i]);
}
*num1=*num2=0;
for(auto i:one)
*num1^=i;
for(auto i:zero)
*num2^=i;
}
};
题目变形 如果是 只有一个数字出现了一次 其他的都出现了3次或者是k次;怎么解决呢?
解法就是 将每个数的二进制的每一位加起来;找出来不能够被3或者k整除的那些位;设置为1;别的都为0 最后的结果就是这个数;