一个整形数组,分别寻找两个只出现一次的元素和一个只出现一次的元素

一个只出现一次的元素
  • 输入:

1 3 5 7 1 3 5

  • 输出:

7

这里介绍采用异或的方法:

0^0=0
0^1=1
1^1=0
相同的数异或为0,任何数和0异或为这个数

我们可以利用这一点,异或整个数组,返回这一个元素
代码如下:

int Search(int arr[], int len){   
	int i, tmp = 0;
	for (i = 0; i < len; i++){
		tmp ^= arr[i];
	}
	return tmp;
}
两个只出现一次的元素
  • 输入

1 3 5 1 3 9

  • 输出

5 9

在这里插入图片描述
代码如下:

void   Search1(int arr[], int len) {
	int i = 0,j=0,result=0;
	int pos = 0;
	int t = 0;  
	for (i = 0; i < len;i++) {
		result ^= arr[i];
	}
	//寻找第一次出现1的位置
	for (pos = 0; pos < 32;pos++) {
		if (((result >> pos) & 1) == 1) {
			break;
		}
	}
	//寻找数组中相同位置出现1的数,进行异或
	for (j = 0; j < len;j++) {
		if (((arr[j]>>pos)&1)==1) {
			t ^= arr[j];
		}
	}
	printf("%d %d\n",t , result^t);
}
发布了50 篇原创文章 · 获赞 19 · 访问量 4736

猜你喜欢

转载自blog.csdn.net/qq_44723296/article/details/99872018