标签:
题目:一个整型数组里除了两个数字外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(N),空间复杂度为O(1)。#include <iostream> using namespace std; int arr[8]={2,4,3,6,3,2,5,5}; //判断二进制位是否是1; bool IsBit1(int num,unsigned int indexBit) { num=num>>indexBit; return num&1; } //找到数组进行异或操作后第一个是1的二进制位。 unsigned int FindFirstBitIs1(int num) { int indexBit=0; while((num & 1)==0 && (indexBit<8*sizeof(int))) { num=num>>1; ++indexBit; } return indexBit; } //找到出现一次的的数子 void FindNumAppearOnce(int *arr,int length,int *num1,int *num2) { if(arr==NULL || length<2) return ; int resultExclusiveOR=0; for(int i=0;i<length;++i) resultExclusiveOR^=arr[i]; unsigned int indexof1=FindFirstBitIs1(resultExclusiveOR); *num1=*num2=0; for(int j=0;j<length;++j) { if(IsBit1(arr[j],indexof1)) *num1^=arr[j]; else *num2^=arr[j]; } } int main() { int num1,num2; FindNumAppearOnce(arr,8,&num1,&num2); cout<<"只出现一次的两个数为:"<<num1<<" "<<num2<<endl; system("pause"); return 0; }
运行结果:
标签:
原文地址:http://blog.csdn.net/gogokongyin/article/details/51712738