问题描述:定义一个整型数组,你需要找到数组中的单身狗(即只出现了一次的数)。
如果有可能,请使用不同的方法实现。
下面是代码实现部分:
方法一:暴力求解
#include<stdio.h>
int main()
{
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++)
{
int j = 0;
int count = 0;//统计arr【i】在数组中出现的次数
for(j = 0;j<sz;j++)
{
if(arr[i]==arr[j])
{
count++;
}
}
if(count == 1)
{
printf("单身狗是%d",arr[i]);
break;
}
}
代码解释:
使用了一个双重循环来查找一个整型数组中只出现一次的元素。具体来说,它遍历数组中的每个元素,然后再次遍历整个数组来统计每个元素出现的次数。如果某个元素只出现了一次,它就会打印出该元素并且跳出循环。
这种方法被称为"暴力求解",因为它使用了两个嵌套的循环来解决问题。虽然这种方法可以找到数组中只出现一次的元素,但它的效率并不高,特别是在处理大型数组时。通常情况下,有更有效率的算法可以解决这类问题。
方法二:巧妙异或
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4};
int i = 0;//只需要将所有的数字都按位异或到一起
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = 0;
for(i = 0;i< sz;i++)
{
ret = ret^arr[i];
}
printf("单身狗是%d",ret);
return 0;
}
代码解释:
该函数使用了一个for循环来对整型数组中的所有元素进行按位异或操作。按位异或操作(^)是一种逻辑运算,当两个操作数相应的位不同时,结果为1;相同时,结果为0。
在这个代码中,通过对数组中的所有元素进行按位异或操作,最终得到的结果就是数组中只出现一次的元素。这是因为按位异或操作满足交换律和结合律,所以数组中成对出现的元素在按位异或后会相互抵消,而只出现一次的元素则会保留下来。
因此,通过对数组中所有元素进行按位异或操作,最终得到的ret就是数组中只出现一次的元素。最后,代码打印出ret作为结果。
这种方法相对于之前提到的"暴力求解"方法更加高效,因为它只需要遍历一次数组就可以找到只出现一次的元素。
运行结果: