剑指Offer——数组中只出现一次的两个数字
2016-05-18 16:51
477 查看
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写出程序找出这两个数字。要求时间复杂度为O(n),空间复杂度为O(1)。
Step1:将整个数组分为两个子数组,子数组里分别包含一个只出现一次的数字,其他数字为成对出现两次的数字。
Step2:分别求每个子数组中,只出现一次的数字。
Step1:将整个数组分为两个子数组,子数组里分别包含一个只出现一次的数字,其他数字为成对出现两次的数字。
Step2:分别求每个子数组中,只出现一次的数字。
//整数num最右边位1的位置 unsigned int FindFirst1(int num) { int index=0; while(((num&1)==0)&&(index<8*2)) { num=num>>1; ++index; } return index; } //检验num的第index个位置是否为1 bool IsBit1(int num,unsigned int index) { num=num>>index; return (num&1); } void NumbersAppearOnce(int data[],int length,int *num1,int *num2) { if(data==NULL||length<2) return; //将整个数组的每个元素进行异或 int ResultExcusiveOr=0; for(int i=0;i<length;++i) ResultExcusiveOr^=data[i]; //整个数组异或结果,最右边为1的位置 unsigned int indexof1=FindFirst1(ResultExcusiveOr); *num1=*num2=0; for(int j=0;j<length;++j) { if(IsBit1(data[j],indexof1)) *num1^=data[j]; else *num2^=data[j]; } }
相关文章推荐
- 关于使用jsp:include标签及<%@ include标签时要注意的事项
- JSP 最佳实践: 用 jsp:include 控制动态内容
- 1.AngularJS 模块
- 三种Ceph rgw前端的配置方式
- HTML中的列表
- 如何判断Javascript对象是否存在的简单实例
- 辨析Java中的String与StringBuffer及StringBuilder字符串类
- jquery遍历json对象集合详解
- JavaScript学习日志——内建的全局函数
- 关于nodejs iconv的编码无效 说明
- html5-在网页中拖放文字
- Jquery 让contains不区分大小写
- 网页设计 DIV+CSS――自适应高度
- <css3>用户界面
- var声明
- 【JavaScript】select选中Option
- web前端培训:为什么懂PHP前端容易被重用
- HTML5拖拽
- css引用第三方字体库
- js实现复制到剪贴板功能,兼容所有浏览器