描述:
菜学长有一堆糖糖,菜学长的糖糖都有自己的标号并且同一个标号的糖糖总有偶数个,但是有一天被贪吃的学姐吃掉了一个,菜学长很生气,你能帮菜学长找出这个糖糖的标号吗?
输入:
第一行包含一个整数n(3=<n<=1000),接下来n个数代表菜学长有n个糖糖(可以知道输入的n总是奇数), 后面n个数代表每个糖糖的标号[0,1e9]
输出:
输出被偷吃掉的糖糖的标号
看到这个题我的第一想法是用桶排类似的方法把糖果的标号记录下来,然后遍历这个数组,找到那个大小为奇数的桶,并输出这个桶的下标,代码如下:
暴力解法
#include<stdio.h>
int main()
{
int arr[1000];
int n;
int duff;
scanf("%d", &n);
for(int i=0;i<n;i++)
{
scanf("%d", &duff);
arr[duff]++;
}
for(int i=0;i<1000;i++)
{
if(arr[i]%2 != 0)
{
printf("%d", i);
break;
}
}
}
这个方法很容易会发现一些问题,就是当数组开的太大时,会报Runtime Error,这个时候就得想想别的解决办法
位运算
异或运算符合交换律,相同数字异或答案为0,将所有数字异或起来输出即可
#include<stdio.h>
int main()
{
int arr[1001];
int a = 0;
int n;
scanf("%d", &n);
for(int i=0;i<n;i++)
{
scanf("%d", &arr[i]);
}
for(int i=0;i<n;i++)
{
a ^= arr[i];
}
printf("%d", a);
}