21xrx.com
2024-11-22 09:55:56 Friday
登录
文章检索 我的文章 写文章
C++实现数组中出现奇数次的两个数的判断
2023-07-05 05:02:47 深夜i     --     --
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)的优点,且不需要额外的空间。因此,它是一个高效而有效的算法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复