一个数组中只有一个数是唯一的,其他数都是成对出现,找出这个唯一的数
要求时间复杂度为o(n),空间复杂度为o(1)
分析:由于位运算符异或运算的特点,即两个相同的数进行异或运算时,其结果为0,所以当将数组中所有的元素进行异或运算时,其结果必定为那个唯一的数。
代码如下:
int findOnlyNum(int arr[], int len) {
int result = 0;
for (int i = 0; i < len; i++)
{
result = result ^ arr[i];
}
return result;
}
一个数组中有两个数是不同的,其他数都是成对出现,找出这两个不同的数
要求时间复杂度为o(n),空间复杂度为o(1)
分析:当两个数不同时,其二进制位必定有一位是不同的,我们可以找出这个二进制位,并将数组分成两个子数组,保证每个数组中只有一个数是唯一的,这样就会变成问题一的情况。
代码实现如下:
void findTwoDifNums(int arr[], int len, int& num1, int& num2) {
int sum = 0;
for (int i = 0; i < len; i++)
{
sum ^= arr[i];
}
int firstBit = fi