数组中只出现一次的数字(异或方法)
2015-09-13 17:34
162 查看
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:使用异或,但是与在成对出现的数字中查找一个单独的数字不同的是需要利用异或结果的最低位为1的flag将数组中的数字分为两类,一类是与flag按位与为0,另一类为不为0,这样再分别异或一次就能够找出这两个数。很是巧妙。其中有一个语法上容易忽略的坑:==的优先级比&高,所以&时需要加括号。
代码:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { if(data.size() < 2) return; int num = 0,bie = 1; for(int i = 0;i < data.size();i++){ num ^= data[i]; } while(!(num & bie)) bie = bie << 1; for(int i = 0;i < data.size();i++){ if(data[i] & bie) *num1 ^= data[i]; else *num2 ^= data[i]; } }
相关文章推荐
- 关于(n^2-mn-m^2)^2=1的自然数解的研究
- 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。
- oracle connect by 查询省下所有的市县
- (转)用户级和内核级线程
- [BZOJ2157]旅游
- poj2891 Strange Way to Express Integers
- 【网络】(六)TCP的十一种状态
- CentOS下非root源码安装PostgreSQL
- [C++]虚函数
- 在Windows server2003R2 上安装wamp Server出现的问题
- Python如何记录日志
- java中vector与arraylist的区别
- spring+struts2实现上海市市区街道级联
- javascript遍历数组最优写法
- android canvas变形,移动,旋转
- Spark RDD中cache和persist的区别
- Android 音乐播放简介
- codeforces #317B. Minimization dp && greedy
- 高级碰撞检测技术
- android应用中去掉标题栏的方法