剑指offer-数组中只出现一次的数字

来源:互联网 发布:说明书排版用什么软件 编辑:程序博客网 时间:2024/06/05 02:39

题目为一个数组中除了两个数字以外,其它数字都出现过两次,怎么样找出这两个数字呢?

想这个问题时,因为强调了出现两次和一次,其实是可以想到异或算法的,异或算法就是两个数相同为0,不同为1,那么这道题可以先对输入数据整体求一个异或,那么根据异或结果可以将数组分为两个部分,比如说异或结果为0010,则可以根据倒数第二位为1和不为1将数据分为两组,这两组中分别含有一个不重复的数字,对每一组分别做异或,就可以找到不重复数字的两个数。

int once_search(int a[], int n, int &num1,int &num2){if (a == NULL || n < 2)return -1;int allor = 0;for (int i = 0; i < n;i++){allor ^= a[i];//得到整体异或结果}unsigned int resultor = findfirstsee(allor);num1 = num2 = 0;for (int j = 0; j < n; j++){if (isbit(a[j], resultor)){num1 ^= a[j];}elsenum2^= a[j];}return num1, num2;}unsigned int findfirstsee(int allor){int indexbit = 0;while (((allor & 1) == 0) && (indexbit < 8 * sizeof(int))){allor = allor >> 1;++indexbit;}return indexbit;}bool isbit(int number, unsigned int resultor){number = number >> resultor;return(number & 1);}


0 0
原创粉丝点击