第二十七题 数组中只出现1次的2个数

来源:互联网 发布:bim软件分类 编辑:程序博客网 时间:2024/06/12 23:00

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)

思路:通过位与运算能够求出数组中只出现1次的2个数位的结果result,按位求出在result中1出现的第一个位置,因为在这个位置上,2个不同的数一个肯定一个为1,一个为0,通过这个方法把整个数组分为2个部分,一个是这个位置为1的,一个是这个位置为0的,获取这个位置数字为1的数相与即可得到第一个只出现1次的数,第二个数类似。

#include <iostream>using namespace std;//获取某个数在a的位置上是否为1bool innone(int num,unsigned int a){num=num>>a;return(num&1);}//求取num中第一个二进制位上为1的位置int whereposition(int num){int index=0;while (((num & 1) == 0) && (index < 32)){num = num >> 1;++ index;}return index;}//计算出2个不同的值void cout2othernumindata(int data[],int length,int &num1,int &num2){if (data==nullptr){return;}int result=0;for (int i=0;i<length;++i){//位与运算得到2个不同的数的与值result=result^data[i];}int index=whereposition(result);for (int i=0;i<length;++i){if (innone(data[i],index)){//第一个不同的数num1=num1^data[i];}else{//第二个不同的数num2=num2^data[i];}}}int main(){int data[10]={1,2,3,4,5,4,3,2,6,1};int num1=0;int num2=0;cout2othernumindata(data,sizeof(data)/sizeof(int),num1,num2);cout<<num1<<endl;cout<<num2<<endl;return 0;}

0 0
原创粉丝点击