📌  相关文章
📜  使任何两个数组元素相等的最小按位异或运算

📅  最后修改于: 2021-10-27 07:45:24             🧑  作者: Mango

给定一个由大小为N的整数和一个整数K 组成的数组 arr[] 。可以在任何数组元素和K之间执行任意次数的按位异或运算。任务是打印使数组的任何两个元素相等所需的最少此类操作数。如果在执行上述操作后无法使数组的任何两个元素相等,则打印 -1。
例子:

方法:关键观察是,如果可以制作所需的数组,那么答案将是 0、1 或 2。它永远不会超过 2。

  1. 如果数组中已经有相等的元素,则答案为0
  2. 对于答案1 ,我们将创建一个新数组b[] ,其中包含b[i] = (a[i] ^ K)
    现在,对于每个a[i]我们将检查是否有任何索引j使得i != ja[i] = b[j]
    如果是,那么答案将是1
  3. 对于答案2 ,我们将检查新数组b[] 中的索引i ,如果存在任何索引j使得i != jb[i] = b[j]
    如果是,那么答案将是2
  4. 如果不满足上述任何条件,则答案将为-1

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to return the count of
// minimum operations required
int minOperations(int a[], int n, int K)
{
    unordered_map map;
    for (int i = 0; i < n; i++) {
 
        // Check if the initial array
        // already contains an equal pair
        if (map[a[i]])
            return 0;
        map[a[i]] = true;
    }
 
    // Create new array with XOR operations
    int b[n];
    for (int i = 0; i < n; i++)
        b[i] = a[i] ^ K;
 
    // Clear the map
    map.clear();
 
    // Check if the solution
    // is a single operation
    for (int i = 0; i < n; i++) {
 
        // If Bitwise XOR operation between
        // 'k' and a[i] gives
        // a number other than a[i]
        if (a[i] != b[i])
            map[b[i]] = true;
    }
 
    // Check if any of the a[i]
    // gets equal to any other element
    // of the array after the operation
    for (int i = 0; i < n; i++)
 
        // Single operation
        // will be enough
        if (map[a[i]])
            return 1;
 
    // Clear the map
    map.clear();
 
    // Check if the solution
    // is two operations
    for (int i = 0; i < n; i++) {
 
        // Check if the array 'b'
        // contains duplicates
        if (map[b[i]])
            return 2;
 
        map[b[i]] = true;
    }
 
    // Otherwise it is impossible to
    // create such an array with
    // Bitwise XOR operations
    return -1;
}
 
// Driver code
int main()
{
 
    int K = 3;
    int a[] = { 1, 9, 4, 3 };
    int n = sizeof(a) / sizeof(a[0]);
 
    // Function call to compute the result
    cout << minOperations(a, n, K);
 
    return 0;
}


Java
// Java implementation of the approach
import java.util.HashMap;
 
class GFG
{
    // Function to return the count of
    // minimum operations required
    static int minOperations(int[] a, int n, int k)
    {
        HashMap map = new HashMap<>();
        for (int i = 0; i < n; i++)
        {
 
            // Check if the initial array
            // already contains an equal pair
            if (map.containsKey(a[i]) &&
                map.get(a[i]))
                return 0;
            map.put(a[i], true);
        }
 
        // Create new array with XOR operations
        int[] b = new int[n];
        for (int i = 0; i < n; i++)
            b[i] = a[i] ^ k;
 
        // Clear the map
        map.clear();
 
        // Check if the solution
        // is a single operation
        for (int i = 0; i < n; i++)
        {
 
            // If Bitwise XOR operation between
            // 'k' and a[i] gives
            // a number other than a[i]
            if (a[i] != b[i])
                map.put(b[i], true);
        }
 
        // Check if any of the a[i]
        // gets equal to any other element
        // of the array after the operation
        for (int i = 0; i < n; i++)
         
            // Single operation
            // will be enough
            if (map.containsKey(a[i]) &&
                map.get(a[i]))
                return 1;
 
        // Clear the map
        map.clear();
 
        // Check if the solution
        // is two operations
        for (int i = 0; i < n; i++)
        {
 
            // Check if the array 'b'
            // contains duplicates
            if (map.containsKey(b[i]) &&
                map.get(b[i]))
                return 2;
 
            map.put(b[i], true);
        }
 
        // Otherwise it is impossible to
        // create such an array with
        // Bitwise XOR operations
        return -1;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int K = 3;
        int[] a = { 1, 9, 4, 3 };
        int n = a.length;
        System.out.println(minOperations(a, n, K));
    }
}
 
// This code is contributed by
// Vivek Kumar Singh


Python3
# Python3 implementation of the approach
 
# Function to return the count of
# minimum operations required
def minOperations(a, n, K) :
 
    map = dict.fromkeys(a, False);
    for i in range(n) :
 
        # Check if the initial array
        # already contains an equal pair
        if (map[a[i]]) :
            return 0;
        map[a[i]] = True;
 
    # Create new array with XOR operations
    b = [0] * n;
    for i in range(n) :
        b[i] = a[i] ^ K;
 
    # Clear the map
    map.clear();
 
    # Check if the solution
    # is a single operation
    for i in range(n) :
 
        # If Bitwise XOR operation between
        # 'k' and a[i] gives
        # a number other than a[i]
        if (a[i] != b[i]) :
            map[b[i]] = True;
     
    # Check if any of the a[i]
    # gets equal to any other element
    # of the array after the operation
    for i in range(n) :
 
        # Single operation
        # will be enough
        if a[i] in map :
            return 1;
 
    # Clear the map
    map.clear();
 
    # Check if the solution
    # is two operations
    for i in range(n) :
         
        # Check if the array 'b'
        # contains duplicates
        if b[i] in map :
            return 2;
 
        map[b[i]] = True;
 
    # Otherwise it is impossible to
    # create such an array with
    # Bitwise XOR operations
    return -1;
 
# Driver code
if __name__ == "__main__" :
 
    K = 3;
    a = [ 1, 9, 4, 3 ];
    n = len(a);
 
    # Function call to compute the result
    print(minOperations(a, n, K));
 
# This code is contributed by AnkitRai01


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
     
    // Function to return the count of
    // minimum operations required
    public static int minOperations(int[] a,
                                    int n, int K)
    {
 
        Dictionary map =
                new Dictionary();
 
        for (int i = 0; i < n; i++)
        {
 
            // Check if the initial array
            // already contains an equal pair
            if (map.ContainsKey(a[i]))
                return 0;
 
            map.Add(a[i], true);
        }
 
        // Create new array with XOR operations
        int[] b = new int[n];
        for (int i = 0; i < n; i++)
            b[i] = a[i] ^ K;
 
        // Clear the map
        map.Clear();
 
        // Check if the solution
        // is a single operation
        for (int i = 0; i < n; i++)
        {
 
            // If Bitwise OR operation between
            // 'k' and a[i] gives
            // a number other than a[i]
            if (a[i] != b[i])
                map.Add(b[i], true);
        }
 
        // Check if any of the a[i]
        // gets equal to any other element
        // of the array after the operation
        for (int i = 0; i < n; i++)
        {
 
            // Single operation
            // will be enough
            if (map.ContainsKey(a[i]))
                return 1;
        }
 
        // Clear the map
        map.Clear();
 
        // Check if the solution
        // is two operations
        for (int i = 0; i < n; i++)
        {
 
            // Check if the array 'b'
            // contains duplicates
            if (map.ContainsKey(b[i]))
                return 2;
            map.Add(b[i], true);
        }
 
        // Otherwise it is impossible to
        // create such an array with
        // Bitwise OR operations
        return -1;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int K = 3;
        int[] a = { 1, 9, 4, 3 };
        int n = a.Length;
        Console.WriteLine(minOperations(a, n, K));
    }
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:
-1

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程