杭电2095 find your present (2) (位运算 异或)
2019-02-07 00:23
16 查看
杭电2095 http://acm.hdu.edu.cn/showproblem.php?pid=2095
题目大意:
给定奇数个整数,找出其中只出现一次的数字。
原始思路很简单,可以开数组记录每个数字出现的次数,出现一次该数字+1,最后输出为1的数组下标即可,但是这样需要数组开到足够大,会爆内存。
改进点可以排序后遍历数组,前后相同的全部置0,最后输出非零项,但是这样会出TLE,超时。
最好的方法是进行位运算。
这里用到的是^(异或)。
用0去^每一个输入的数字。
[code]0异或任何数 = 任何数 任何数 异或 自己 = 0 一个数连续对相同的数进行两次异或 = 该数本身
所以这样最后剩下的就是这个只出现一次的奇异数。
以下给出两份代码:
(排序置0) 会超时!
[code]#include <iostream> #include <algorithm> #include <iomanip> using namespace std; int n; int x; int b[1000005]; int main() { while(~scanf("%d",&n)) { if (n == 0) { return 0; } else { for (int i = 0; i < n; i++) { scanf("%d", &b[i]); } sort(b,b+n); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(b[i]==b[j]) { b[i]=0; b[j]=0; } } } } for(int i=0;i<n;i++) { if(b[i]) { printf("%d\n",b[i]); } } } return 0; }
正确解答(位运算异或) :
[code]#include <iostream> using namespace std; int n; int a,b; int main() { while(~scanf("%d",&n)) { if(n==0) { return 0; } else { a=0; while(n--) { scanf("%d",&b); a^=b; } printf("%d\n",a); } } return 0; }
非常简洁高效。
相关文章推荐
- 杭电 2095 find your present (2)【位运算 异或】
- hdoj 1563 Find your present!&&2095 Find your present(2) 异或运算
- HDU 2095 find your present (2) 【异或】
- HDU 2095 find your present(异或位运算)
- HDU-2095 find your present (2) 按位异或求解
- find your present (2) v【 异或运算的巧用】
- 武汉科技大学计算机学院菜鸟杯:find your present (2).(杭电2095)
- 杭电OJ(HDOJ)2095题:find your present (2)(数论)
- hdoj_2095_Find your present (2) (位异或)
- HDU 2095 find your present (2)(位运算 或 排序做)
- 杭电2095(find your present (2))
- 【菜鸟做水题】:杭电 find your present(用异或的解题思想)
- HDU 2095 find your present (2) 异或的经典运用
- 杭电2095 find your present (2)
- hdoj 2095 find your present (2)【位运算,异或】
- 杭电OJ-- 2095 find your present (依然很水)
- HDU 2095 find your present (2) 异或的经典运用
- hdu - 2095 - find your present (2)(异或)
- 【杭电-oj】-2095-find your present (2)(输出奇数个的数)
- HDU 2095 find your present (2) (异或)