使用C++查找XOR值为零的唯一三元组的数量


在本文中,我们将讨论如何在一个给定的唯一数字数组中计算唯一三元组 (x, y, z) 的数量,其中它们的XOR值为0。因此,三元组应该是唯一的,所有三个元素都是唯一的,并且将计算所有三元组的组合,例如:

Input : arr[ ] = { 5, 6, 7, 1, 3 }
Output : 2
Explanation : triplets are { 5, 6, 3 } and { 6, 7, 1 } whose XOR is zero.

Input : arr[ ] = { 3, 6, 8, 1, 5, 4 , 12}
Output : 3
Explanation : Triplets are { 3, 6, 5 }, { 1, 5, 4 } and { 4, 8, 12 } whose XOR is zero.

寻找解决方案的方法

我们知道相同值的XOR总是为零。所以我们找到唯一的三元组,可以使用一种乐观的方法,即找到数组中两个值的XOR并存储结果,然后在数组中搜索等于该结果的值。此外,结果值不应等于对中的任何值。寻找:

示例

#include <bits/stdc++.h>
using namespace std;

int main () {
   int arr[] = { 3, 6, 8, 1, 5, 4, 12 };
   int n = sizeof (arr) / sizeof (arr[0]);
   int result;
   // count variable to keep count of pairs.
   int count = 0;
   // creating a set to store unique numbers .
   unordered_set < int >values;
   // inserting values in set.
   for (int i = 0; i < n; i++)
      values.insert (arr[i]);


   // traverse for all pairs to calculate XOR.
   for (int i = 0; i < n - 1; i++) {
      for (int j = i + 1; j < n; j++) { // finding xor of i, j pair.
         int XR = arr[i] ^ arr[j];

         // checking if XOR value of pair present in array
         // and value should not be in pairs.
         if (values.find (XR) != values.end () && XR != arr[i] &&
            XR != arr[j])
            count++;
      }

   }
   // storing result
   result = count / 3;
   cout << "Number of unique triplets : " << result;
   return 0;
}

输出

Number of unique triplets : 3

以上代码的解释

  • 创建一个无序集合`unordered_set values;` 来存储给定数组的唯一数字。
  • 使用`for()`循环使用`values.insert(arr[i])`将值插入集合。
  • 使用两个嵌套循环遍历所有对并计算它们的XOR值。
  • 然后,在数组中搜索XOR值,如果在数组中找到该值且不在对中,则递增计数。
  • 将结果存储为`count / 3`,这将计算三元组的三种组合,而我们需要唯一的三元组。

结论

本文讨论了如何查找XOR值为0的三元组的数量;我们讨论了一种查找唯一三元组的乐观方法。我们还讨论了用于解决该问题的C++程序。但是,我们可以使用其他编程语言(如Java、C、Python等)编写此程序。我们希望您觉得本文有所帮助。

更新于:2021年11月26日

419 次查看

启动您的职业生涯

通过完成课程获得认证

开始
广告