给定一个数组,找出其中只出现一次的数字,其余数字都是出现两个以上。(找出单身狗)

方法一:暴力解法;通过计算每个数字出现的次数来找出只出现一次的数字

        int arr[] = {1,2,3,4,5,1,2,3,4};//找出单身狗
	int i = 0;
	int sz = sizeof(arr)  /  sizeof(arr[0]);//计算数组的元素个数
	for (i = 0; i < sz; i++)//统计arr[i]出现在数组中的次数
	{
		int j = 0;
		int count = 0;//计数器,计算数字出现了几次
		for (j = 0; j < sz; j++)
		{
			if (arr[i] == arr[j])//判断出现次数
			{
				count++;// 相等一次加1,正常情况下是2
			}
		}
		if (count == 1)
		{
			printf("只出现一次的数字是%d\n", arr[i]);
			break;
		}
	}

  时间复杂度为O(n²)

方法二:按位运算:异或运算法

异或:^;

的计算规则是转换为二进制数后,两边的对应位不同时,取1,否则取0。如果遇到负数,需要用负数的补码进行计算。

当两个相同的数做异或运算时,他们运算后的结果是0。例如3^3->011^011=000,101^101=0;

当0和一个非零的数进行异或运算时,运算结果是那个非零的数。例如0^3->000^011=011;

本题中,重复的元素都是出现两次,只会有一个元素只出现一次,那么对所有的元素进行异或运算,最后得到的结果就是那个只出现了一次的元素。

        int arr[] = { 1, 2, 3, 4, 5, 1, 2, 3, 4 };
	int i = 0;
	int su = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		su = su ^ arr[i];
	}
	printf("只出现一次的数字:%d\n",su);

  时间复杂度为O(n)

 

posted @ 2023-01-17 18:08  青空zsl  阅读(36)  评论(0)    收藏  举报