算法很美第一章 位运算的奇巧淫技

第一章 位运算的奇巧淫技

1.2 题解:如何找数组中唯一成对的那个数

算法很美第一章 位运算的奇巧淫技_第1张图片

知识点:

  1. A^A=0
  2. A^0=A(一个数与0进行按位异或,结果是他自己)
  3. 对一个序列进行按位异或,可以消除掉序列中的重复项,比如:A^A ^B ^C ^C=B(根据第1、2条规则)
  4. 对一个序列补一下,就可以将不重复的元素变成重复的元素,重复的元素变成不重复的,从而可以找到原本序列中重复项。比如原本是 A^B ^C ^C,来互补一下,变成 A ^B ^C ^C ^A ^B ^C=C
  5. 使用^,计算机会对每一个变量的二进制存储形式做按位异或。

程序思路:

异或法:

计算式子:题设数组的每一个元素依次进行按位异或,所得结果再与1到1000依次进行按位异或,所得结果即为重复项。

暴力法:

使用辅助数组arr_tag来记录arr数组中,1到1000出现的次数,将arr元素的值对应成arr_tag下标,对应的下标对应的元素值为出现的次数。


```c
#include "stdio.h"
#define arr_len 1000
int main()
{
	int arr[arr_len+1];
	int random = 59;//重复项
	int i;
	//待处理数列生成
	for (i = 1; i<= arr_len; i++) {
		arr[i - 1] = i;
		/*printf("arr[%d]=%d\n", i-1, i);*/
	}
	arr[arr_len] = random;

	//异或法求解
	int middle = 0;
	for (i=0;i

你可能感兴趣的:(算法很美课程)