题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
题目分析
剑指Offer(纪念版)P211
① 自己与自己异或为0
② 0与数A异或为A
③ 异或满足交换律
代码实现
void FindNumsAppearOnce(int data[], int length, int* num1, int* num2)
{if (data == NULL || length < 2)return;int resultExclusiveOR = 0;for (int i = 0; i < length; ++ i)resultExclusiveOR ^= data[i];unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR); *num1 = *num2 = 0;for (int j = 0; j < length; ++ j){if(IsBit1(data[j], indexOf1))*num1 ^= data[j];else*num2 ^= data[j];}
}// 找到num从右边数起第一个是1的位
unsigned int FindFirstBitIs1(int num)
{int indexBit = 0;while (((num & 1) == 0) && (indexBit < 8 * sizeof(int))){num = num >> 1;++ indexBit;}return indexBit;
}// 判断数字num的第indexBit位是不是1
bool IsBit1(int num, unsigned int indexBit)
{num = num >> indexBit;return (num & 1);
}