博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj_2095_Find your present (2) (位异或)
阅读量:6221 次
发布时间:2019-06-21

本文共 927 字,大约阅读时间需要 3 分钟。

hot3.png

题意:

给你n个数字,已知只有一个数字出现了奇数次,其他数字都出现了偶数次,要求你找出这个特别的数字。

解题思路:

题目内存限制:1024K,所以不能简单地用数组存然后再处理。

为了节约内存,可以用STL里面的set,map等容器。

当容器里没有这个元素的时候,就插入这个元素,否则,删除这个元素。

最后,容器中肯定只剩下一个元素,便是我们所要的结果。

[cpp] 
  1. #include <set>  
  2. #include <stdio.h>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     int n,x;  
  7.     set <int> S;  
  8.     while(scanf("%d",&n),n)  
  9.     {  
  10.         while(n--)  
  11.         {  
  12.             scanf("%d",&x);  
  13.             if(S.find(x) == S.end())    //没找到,插入  
  14.                 S.insert(x);  
  15.             else                        //找到了,删除  
  16.                 S.erase(x);  
  17.         }  
  18.         printf("%d\n",*S.begin());  
  19.         S.clear();  
  20.     }  
  21.     return 0;  
  22. }  

其实,这题还有个更好的方法————位异或。

我们先了解一下位异或的运算法则吧:

1、a^b = b^a。

2、(a^b)^c = a^(b^c)。

3、a^b^a = b。

对于一个任意一个数n,它有几个特殊的性质:

1、0^n = n。

2、n^n = 0。

所以可以通过每次异或运算,最后剩下的值就是出现奇数次的那个数字。

[cpp] 
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     int n,x,ans;  
  5.     while(scanf("%d",&n),n)  
  6.     {  
  7.         ans = 0;  
  8.         while(n--)  
  9.         {  
  10.             scanf("%d",&x);  
  11.             ans ^= x;  
  12.         }  
  13.         printf("%d\n",ans);  
  14.     }  
  15.     return 0;  
  16. }  
PS:话说通过位运算的这些性质,可以通过不借用中间变量实现a,b的值的交换。
[cpp] 
  1. void swap(int &a,int &b)  
  2. {  
  3.     a ^= b;  
  4.     b ^= a;  
  5.     a ^= b;  
  6. }  

转载于:https://my.oschina.net/dianpaopao/blog/168062

你可能感兴趣的文章
struts2 文件下载 报错
查看>>
论个人网站备份的重要性
查看>>
使用xtrabackup备份和还原mysql的多实例(基于全备)
查看>>
监控磁盘读写状况
查看>>
Dockerfile 配置
查看>>
Python中创建虚拟环境
查看>>
foundation的sass版本
查看>>
PHP 代码生成图片验证码!你们值得拥有
查看>>
《编写可维护的JavaScript》第1部分编程风格小结
查看>>
如何成为一名业余程序员
查看>>
为Tomcat添加启动、停止、重启
查看>>
Nginx视频点播安装配置
查看>>
无状态地址自动配置
查看>>
各种排序算法的分析及java实现
查看>>
linux下退出VI的方法:不保存退出:q! 先保存后退出:wq
查看>>
小白之复习与提高3
查看>>
RAID技术
查看>>
centos6.5安装MySQL5.7(使用yum源安装方法)
查看>>
想要明白什么是key/value数据库
查看>>
模拟三次密码输入
查看>>