📜  异或为零的唯一三元组数的Java程序

📅  最后修改于: 2022-05-13 01:55:28.781000             🧑  作者: Mango

异或为零的唯一三元组数的Java程序

给定 N 个没有重复的数字,计算唯一三元组(a i ,a j ,a k的数量,使其 XOR 为 0。如果三元组中的所有三个数字都是唯一的,则称三元组是唯一的。

例子:

Input : a[] = {1, 3, 5, 10, 14, 15};
Output : 2 
Explanation : {1, 14, 15} and {5, 10, 15} are the 
              unique triplets whose XOR is 0. 
              {1, 14, 15} and all other combinations of 
              1, 14, 15 are considered as 1 only.

Input : a[] = {4, 7, 5, 8, 3, 9};
Output : 1
Explanation : {4, 7, 3} is the only triplet whose XOR is 0 

朴素的方法:一种朴素的方法是运行三个嵌套循环,第一个从 0 到 n,第二个从 i+1 到 n,最后一个从 j+1 到 n,以获得唯一的三元组。计算 a i 、 a j 、 a k的异或,检查是否等于 0。如果是,则增加计数。
时间复杂度:O(n 3 )

Efficient Approach :一种有效的方法是使用 XOR 的一个属性:两个相同数字的 XOR 给出 0。所以我们只需要计算唯一对的 XOR,如果计算的 XOR 是数组元素之一,然后我们得到 XOR 为 0 的三元组。下面是计算唯一三元组数量的步骤:
以下是此方法的完整算法:

  1. 使用地图,标记所有数组元素。
  2. 运行两个嵌套循环,一个来自 in-1,另一个来自 i+1-n 以获取所有对。
  3. 获取该对的 XOR。
  4. 检查 XOR 是否是数组元素,而不是 a i或 a j之一。
  5. 如果条件成立,则增加计数。
  6. 返回 count/3 因为我们只想要唯一的三元组。因为 in 和 j+1-n 给了我们唯一的对而不是三元组,所以我们做一个 count/3 来删除其他两个可能的组合。

下面是上述思想的实现:

Java
// Java program to count 
// the number of unique 
// triplets whose XOR is 0
import java.io.*;
import java.util.*;
  
class GFG
{
    // function to count the 
    // number of unique triplets
    // whose xor is 0
    static int countTriplets(int []a, 
                             int n) 
    {
        // To store values 
        // that are present
        ArrayList s = 
                  new ArrayList();
        for (int i = 0; i < n; i++)
            s.add(a[i]);
          
        // stores the count 
        // of unique triplets
        int count = 0;
          
        // traverse for all i, 
        // j pairs such that j>i
        for (int i = 0; i < n; i++) 
        {
            for (int j = i + 1; 
                     j < n; j++)
            {
      
            // xor of a[i] and a[j]
            int xr = a[i] ^ a[j];
          
            // if xr of two numbers 
            // is present, then 
            // increase the count
            if (s.contains(xr) &&
                xr != a[i] && xr != a[j])
                count++;
            }
        }
          
        // returns answer
        return count / 3;
    }
      
    // Driver code
    public static void main(String srgs[])
    {
        int []a = {1, 3, 5, 
                   10, 14, 15};
        int n = a.length;
        System.out.print(countTriplets(a, n));
    }
}
  
// This code is contributed by 
// Manish Shaw(manishshaw1)


输出:

2

时间复杂度: O(n 2 )

有关更多详细信息,请参阅有关 XOR 为零的唯一三元组数的完整文章!