HDOJ 2095 find your present (2)

本文介绍了一种使用异或操作解决特定类型问题的方法。通过理解异或的基本原理:任何数与其自身异或等于0,任何数与0异或等于其本身,可以高效地找出数组中仅出现一次的元素。文章对比了两种解题思路,一种是直接统计每个数出现的次数,另一种则是利用异或特性简化计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应该是很简单的水题,不过再简单思路不对也是白搭

第一感觉,很不幸,

Memory Limit Exceeded 版本

#include <iostream> using namespace std; int num[1000001]; int main() { int n,temp,i,m; while(scanf("%d",&n)&&n) { memset(num,0,sizeof(num)); m=n; while(m--) { scanf("%d",&temp); num[temp]++; } for(i=1;i<=n;i++) if(num[i]==1) printf("%d/n",i); } }

后来才发现,原来还可以用异或这东西

主要原理 1个数异或他自己 =0

1个数异或0 = 他自己

理解了上面这个就好办了,题目中说的其他数字都出现偶数次,只一个数出现一次

如果 将 0异或他们全部,结果将是只出现一次的那个数

于是有了下面的

#include <iostream> using namespace std; int main() { int n,temp,i; while(scanf("%d",&n)&&n) { int result=0; while(n--) { scanf("%d",&temp); result=result^temp; } cout<<result<<endl; } }

AC 开阔思路啊开阔思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值