一、找一条单身狗
方法(1)暴力求解法—统计每个元素出现的次数
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4};
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i=0;i<sz;i++)
{
int count = 0;
for (int j=0;j<sz;j++)
{
if (arr[i]==arr[j])
{
count++;
}
}
if (1==count)
{
printf("单身狗是:%d\n",arr[i]);
break;
}
}
return 0;
}
方法(2)异或求解法
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4};
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = 0;
for (int i=0;i<sz;i++)
{
ret^=arr[i];
}
printf("单身狗是:%d\n",ret);
return 0;
}
二、找两条单身狗
方法(1)暴力求解法(见上文找一条单身狗方法)
方法(2)异或的方法(将两个单的数组分到两组里面)
#include <stdio.h>
void find_single_dog(int arr[],int sz)
{
int single1 = 0;
int single2 = 0;
int ret = 0;
for (int i=0;i<sz;i++)
{
ret ^= arr[i];
}
int pos = 0;
for (int i=0;i<32;i++)
{
if ( 1==((ret>>i)&1) )
{
pos = i;
break;
}
}
for (int i=0;i<sz;i++)
{
if( 1==( (arr[i] >>pos)&1 ) )
{
single1 ^= arr[i];
}
}
single2 = ret ^ single1;
printf("单身狗为:%d %d\n",single1,single2);
}
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4,6};
int sz = sizeof(arr) / sizeof(arr[0]);
find_single_dog(arr,sz);
return 0;
}
三、交换两个变量的值
方法(1):最常用(使用范围更广),创建临时变量
#include <stdio.h>
void swap(int* x,int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 1;
int b = 2;
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
方法(2):用按位异或的方法(仅仅适用于整型变量)
#include <stdio.h>
int main()
{
int a = 3;
int b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d\n",a,b);
return 0;
}