21xrx.com
2025-03-27 19:19:07 Thursday
文章检索 我的文章 写文章
C++实现数组中出现奇数次的两个数的判断
2023-07-05 05:02:47 深夜i     18     0
C++ 数组 奇数次 两个数 判断

在C++语言中,判断数组中出现奇数次的两个数并不是一件容易的事情。但是,我们可以利用位运算来解决这个问题。

设数组中出现奇数次的两个数为a和b。首先,我们需要将数组中的所有元素进行异或操作,这样得到的结果就是a和b的异或结果,假设为c。

那么我们可以根据c中二进制中的某一位来判断a和b在该位上是否相同。假设第i位上a和b不同,那么c的第i位肯定为1。我们可以根据c的第i位是1还是0,将数组中的元素分成两组。一组元素在第i位上为1,另一组元素在第i位上为0。

而a和b的第i位一个为1,另一个为0。因此,在第i位上值为1的元素会与a进行异或操作,结果就是a(因为值为1的元素中只有a的第i位为1)。相反,在第i位上值为0的元素中,只有b的第i位为0,所以进行异或操作会得到b。

实现代码如下:

void findOddOccurrences(int arr[], int n)
{
  int xor_val = arr[0];
  for (int i = 1; i < n; i++)
  {
    xor_val ^= arr[i];
  }
  int pos = 0;
  while (pos < 32)
  {
    if (xor_val & (1 << pos))
    
      break;
    
    pos++;
  }
  int a = 0, b = 0;
  for (int i = 0; i < n; i++)
  {
    if (arr[i] & (1 << pos))
    {
      a ^= arr[i];
    }
    else
    {
      b ^= arr[i];
    }
  }
  std::cout << "The two numbers are: " << a << ", " << b << std::endl;
}

该函数的参数为一个整型数组和数组的长度。它将找到数组中出现奇数次的两个数,并将它们打印出来。

这样,我们就完成了C++实现数组中出现奇数次的两个数的判断。这个算法具有时间复杂度为O(n)的优点,且不需要额外的空间。因此,它是一个高效而有效的算法。

  
  

评论区