C语言单身狗问题(找出数组里只出现一次的数)
1.单身狗(1)
①题目及分析
题目:给你一个非空数组,除了某个元素只出现一次外,其余每个元素均出现两次,请找到那个只出现一次的元素。
分析:
1.暴力求解,直接全部遍历一遍。
2.按位异或的性质,相同的数取按位异或后变成0,0和其他的数再按位异或就等于这个数本身,并且按位异或符合交换律。
②代码实现
//暴力求解
#include <stdio.h>
int main()
{
int arr[100] = { 0 };
int i = 0, j = 0, k = 0, a = 0;
printf("请输入数组元素个数:");
scanf("%d", &i);
for (j = 0; j < i; j++)
{
scanf("%d", &arr[j]);
}
for (j = 0; j < i; j++)
{
int flag = 0;//注意flag标记放置的位置,如果放在最开始,就无法起到判断的作用了,改变成1之后就再也变不回来了。
for (k = 0; k < i; k++)
{
if ((arr[j] == arr[k]) && (j != k))
{
flag = 1;
break;
}
}
if (0 == flag)
{
a = j;
break;
}
}
printf("%d\n", arr[a]);
}
//使用按位异或
#include <stdio.h>
int main()
{
int arr[100] = { 0 };
int i = 0, j = 0, k = 0;
printf("请输入数组元素个数:");
scanf("%d", &i);
for (j = 0; j < i; j++)
{
scanf("%d", &arr[j]);
}
int ret = arr[0];
for (j = 1; j < i; j++)
{
ret = ret ^ arr[j];
}
printf("%d\n", ret);
}
2.单身狗(2)
①题目及分析
题目:一个数组里面除了两个数以外,其他数都两两相等,请找出这两个数。
分析:如果使用按位异或的话,我们可以得到一个数,这个数会在第N位(从右往左数)是1,1说明这一位不同,这一位的不同就是两位单独的数在这一位不同,所以我们可以依靠第N位是0和第N位是1将这两个数分开,并将整个数组分为两个数组,再通过第一类的方法来解决。
②代码实现
#include <stdio.h>
int main()
{
int arr[100] = { 0 };
int i = 0, j = 0, k = 0;
printf("请输入数组元素个数:");
scanf("%d", &i);
for (j = 0; j < i; j++)
{
scanf("%d", &arr[j]);
}
int ret = arr[0];
for (j = 1; j < i; j++)
{
ret = ret ^ arr[j];
}
for (j = 0; j < 32; j++)
{
if (ret & (1 << j) != 0)
{
break;
}
}
int ret1 = 0, ret2 = 0;
for (k = 0; k < i; k++)
{
if (arr[k] & (1 << j) != 0)
{
ret1 = ret1 ^ arr[k];
}
else
{
ret2 = ret2 ^ arr[k];
}
}
printf("%d %d\n", ret1, ret2);
return 0;
}