//思路:如果只有一个数字出现了一次,那么异或所有数字,结果就为该数字
//同理,如果有两个数字,那么将这两个数字分在两个小组里,各自异或就ok了
//首先,将所有数字异或,找出结果二进制中为1的最低位n
//然后,根据数字第n位是否为1,分为两组各自异或即可。
#include <iostream>
using namespace std;
int findthefirstindex(int n)//找到第一个为1的位数(最低位开始)
{
int index=0;
while(((n&1)==0) && (index<(8*sizeof(int))))
{
n>>=1;
index++;
}
return index;
}
int isindex(int ai,int index)//测试该元素index位是否为1
{
return ai>>index&1;
}
void findnumsappearonce(int a[],int leng)//寻找只出现一次的元素
{
if(a==NULL && leng<2)
return;
int resultxor=0;
for(int i=0;i<leng;i++)//对所有的元素进行异或运算
resultxor^=a[i];
int firstindex=findthefirstindex(resultxor);//找到第一个为1的位数(最低位开始)
int num1,num2;
num1=num2=0
for (int i=0;i<leng;i++)
{
if(isindex(a[i],firstindex))//元素分组,各自异或,剩下的即是单一元素
num1^=a[i];
else
num2^=a[i];
}
cout<<num1<<' '<<num2;
}
int main()
{
int a[10] = {2,4,3,6,3,2,5,5};
for(int i=0;i<8;i++)
cout<<a[i]<<' ';
cout<<endl;
findnumsappearonce(a,8);
return 0;
}
数组中只出现一次的数字
最新推荐文章于 2022-04-10 17:21:19 发布