编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
充分理解按位异或操作符的作用.
#include <stdio.h>
#include <stdlib.h>
int main() {
int arr[] = { 0,0,1,1,2,2,3,4,4,5,5,6,6 };
int i = 0;
int j = arr[0];
for (i = 0; i < sizeof arr / sizeof arr[0]; i++) {
j ^= arr[i];
}
printf("%d\n",j);
system("pause");
return 0;
}
进阶:
一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个数字,编程实现。
#include <stdio.h>
#include <stdlib.h>
void LsolatedNumber(int* arr,int size,int* x,int* y) {
int i = 0;
int sum = 0;
int ret = 0;
for (i =0; i < size; ++i) {
ret ^= arr[i];
}
for (i = 0; i < 32;++i) {
if (((ret >> i) & 1) == 1) {
sum = i;
break;
}
}
for (i = 0; i < size; ++i) {
if (((arr[i] >> sum) & 1) == 1) {
*x ^= arr[i];
}
else
{
*y ^= arr[i];
}
}
}
int main() {
int arr[] = { 1,1,2,2,3,3,4,4,5,8 };
int len = sizeof arr / sizeof arr[0];
int x = 0, y = 0;
LsolatedNumber(arr,len,&x,&y);
printf("%d\t %d\n",x,y);
system("pause");
return 0;
}