在一堆数中找出现了1次的数
-
有101个整数,其中有50个数出现了两次,1个数出现了一次,找出出现了一次的那个数。
思路:异或:相同为0,相异为1, 任何数和0异或是自身,和自身异或是0
int main()
{
int i;
int t = 0;
int a[N] = {1,2,3,4,5,6,5,4,2,3,1};
for ( i = 0; i < N; i++)
{
t = t ^ a[i];
}
printf("%d\n", t);
system("pause");
return 0;
}
2 有102个整数,其中有50个数出现了两次,2个数出现了一次, 找出出现了一次的那2个数
考察分堆的思想
step1:先将所有的数异或,得到异或后的结果ret
step2:利用异或后的结果ret与分割值partition按位与,找到分割值
step3:将所有的数与分割值按位与,进行异或
int main()
{
int i, first=0, second=0;
int a[8] = { 9,5,6,8,5,9,7,6 };
int ret = 0;
int partition = 1;
for ( i = 0; i < 8; i++)
{
ret = ret ^ a[i];
}
for ( i = 0; i < 31; i++)
{
if (1==(ret & partition))
{
break;//找到分割值则跳出循环
}
else
{
partition = partition << 1;//不断左移寻找分割值
}
}
for ( i = 0; i < 8; i++)
{
if (partition&a[i])
{
first = first ^ a[i];
}
else
{
second = second ^ a[i];
}
}
printf("%d %d\n", first, second);
system("pause");
return 0;
}