落单的数算法(巧妙的异或运算)
2015-06-04 10:43
411 查看
问题描述:有2n+1个数,其中2n个数两两成对,1个数落单,找出这个数。要求O(n)的时间复杂度,O(1)的空间复杂度。进阶问题:如果有2n+2个数,其中有2个数落单,该怎么办?Java 实现:
public class Tst {public static void main(String[] args) {int arr[] = {1,2,3,2,1};int ret = 0;for(int i=0;i<5;i++){ret^=arr[i];}System.out.println(ret);}}进阶:假设两个不同的数是a和b,并且a!=b,将2n+2个数异或起来就会得到c=a xor b,并且c不等于0。因此在c的二进制位中找到一个为1的位,可推断在这位上a和b分别为0和1,因此将2n+2个数分为该位位0的组和该位为1的组,两组中各自会包含2n’+1个数和2n’’+1个数,用初阶的算法即可解决。
相关文章推荐
- 微信JS-SDK说明文档及常见问题处理
- 人体行为识别数据集
- UVA 10905
- Extjs 4 tabpanel动态加载reconfigure的grid
- play app to war
- CVPR2015文章下载
- [Erlang]Erlang与Java如何进行节点通信
- VS2012中“工具>选项中的VC++目录编辑功能已被否决”解决方法
- Swif基础语法01
- 5. Longest Palindromic Substring
- UICollectionView
- 为项目编写Readme.MD文件
- 九度OJ-题目1513:二进制中1的个数
- PHP程序在浏览器中文乱码问题
- Java中堆和栈的区别
- Linux多线程同步的几种方式
- Mysql 创建联合主键
- 既然迷茫,那就跑步吧!
- 2015-06-04jq写的一个小轮播器
- Java for LeetCode 139 Word Break