📌  相关文章
📜  与整数数组的每个数字进行异或时,找到一个给出最小总和的数字

📅  最后修改于: 2021-04-22 07:54:15             🧑  作者: Mango

给定非负整数的数组arr [] ,任务是找到一个整数X ,使得(arr [0] XOR X)+(arr [1] XOR X)+…+ arr [n – 1] XOR X最小可能。

例子:

方法:我们将检查二进制表示形式的数组中每个数字的‘i’位,并对包含被设置为‘1’的‘i’位进行计数,因为这些设置位将使总和最大化而不是最小化。因此,我们必须使这个集i个位为“0”,如果计数大于N / 2时,如果计数小于N / 2,则具有数字i个位设置较少,所以它不会影响答案。根据对两位的XOR操作,我们知道当A XOR B以及A和B都相同时,其结果为‘0’,因此我们将数字(num)中的‘i’位设为‘1 ‘ ,这样(1 XOR 1)将给出‘0’并最小化总和。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
#include 
using namespace std;
  
// Function to find an integer X such that
// the sum of all the array elements after
// getting XORed with X is minimum
void findX(int arr[], int n)
{
    // Finding Maximum element of array
    int* itr = max_element(arr, arr + n);
  
    // Find Maximum number of bits required
    // in the binary representation
    // of maximum number
    // so log2 is calculated
    int p = log2(*itr) + 1;
  
    // Running loop from p times which is
    // the number of bits required to represent
    // all the elements of the array
    int X = 0;
    for (int i = 0; i < p; i++) {
        int count = 0;
        for (int j = 0; j < n; j++) {
  
            // If the bits in same position are set
            // then count
            if (arr[j] & (1 << i)) {
                count++;
            }
        }
  
        // If count becomes greater than half of
        // size of array then we need to make
        // that bit '0' by setting X bit to '1'
        if (count > (n / 2)) {
  
            // Again using shift operation to calculate
            // the required number
            X += 1 << i;
        }
    }
  
    // Calculate minimized sum
    long long int sum = 0;
    for (int i = 0; i < n; i++)
        sum += (X ^ arr[i]);
  
    // Print solution
    cout << "X = " << X << ", Sum = " << sum;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 3, 4, 5, 6 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    findX(arr, n);
  
    return 0;
}


Java
// Java implementation of above approach
import java.lang.Math;
import java.util.*;
  
class GFG
{
    // Function to find an integer X such that
    // the sum of all the array elements after
    // getting XORed with X is minimum
    public static void findX(int[] a, int n)
    {
          
        // Finding Maximum element of array
        Collections.sort(Arrays.asList(a), null);
        int itr = a[n-1];
          
        // Find Maximum number of bits required
        // in the binary representation
        // of maximum number
        // so log2 is calculated
        int p = (int)(Math.log(itr)/Math.log(2)) + 1;
  
        // Running loop from p times which is
        // the number of bits required to represent
        // all the elements of the array
        int x = 0;
        for (int i = 0; i < p; i++)
        {
            int count = 0;
            for (int j = 0; j < n; j++)
            {
                  
                // If the bits in same position are set
                // then count
                if ((a[j] & (1 << i)) != 0)
                    count++;
            }
  
            // If count becomes greater than half of
            // size of array then we need to make
            // that bit '0' by setting X bit to '1'
            if (count > (n / 2))
            {
                  
                // Again using shift operation to calculate
                // the required number
                x += 1 << i;
            }
        }
  
        // Calculate minimized sum
        long sum = 0;
        for (int i = 0; i < n; i++)
            sum += (x ^ a[i]);
          
        // Print solution
        System.out.println("X = " + x + ", Sum = " + sum);
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int[] a = {2, 3, 4, 5, 6};
        int n = a.length;
  
        findX(a, n);
    }
  
}
  
// This code is contributed by
// sanjeev2552


Python3
# Python 3 implementation of the approach
from math import log2
  
# Function to find an integer X such that
# the sum of all the array elements after
# getting XORed with X is minimum
def findX(arr, n):
      
    # Finding Maximum element of array
    itr = arr[0]
    for i in range(len(arr)):
          
        # Find Maximum number of bits required
        # in the binary representation
        # of maximum number
        # so log2 is calculated
        if(arr[i] > itr):
            itr = arr[i]
  
    p = int(log2(itr)) + 1
  
    # Running loop from p times which is
    # the number of bits required to represent
    # all the elements of the array
    X = 0
    for i in range(p):
        count = 0
        for j in range(n):
              
            # If the bits in same position are set
            # then increase count
            if (arr[j] & (1 << i)):
                count += 1
  
        # If count becomes greater than half of
        # size of array then we need to make
        # that bit '0' by setting X bit to '1'
        if (count > int(n / 2)):
              
            # Again using shift operation to calculate
            # the required number
            X += 1 << i
  
    # Calculate minimized sum
    sum = 0
    for i in range(n):
        sum += (X ^ arr[i])
  
    # Print solution
    print("X =", X, ", Sum =", sum)
  
# Driver code
if __name__=='__main__':
    arr = [2, 3, 4, 5, 6]
    n = len(arr)
    findX(arr, n)
      
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of above approach 
using System;
using System.Linq;
  
class GFG 
{ 
    // Function to find an integer X such that 
    // the sum of all the array elements after 
    // getting XORed with X is minimum
    public static void findX(int[] a, int n) 
    { 
          
        // Finding Maximum element of array 
        int itr = a.Max(); 
          
        // Find Maximum number of bits required 
        // in the binary representation 
        // of maximum number 
        // so log2 is calculated 
        int p = (int) Math.Log(itr, 2) + 1; 
  
        // Running loop from p times which is 
        // the number of bits required to represent 
        // all the elements of the array 
        int x = 0; 
        for (int i = 0; i < p; i++) 
        { 
            int count = 0; 
            for (int j = 0; j < n; j++) 
            { 
                  
                // If the bits in same position are set 
                // then count 
                if ((a[j] & (1 << i)) != 0) 
                    count++; 
            } 
  
            // If count becomes greater than half of 
            // size of array then we need to make 
            // that bit '0' by setting X bit to '1' 
            if (count > (n / 2)) 
            { 
                  
                // Again using shift operation to calculate 
                // the required number 
                x += 1 << i; 
            } 
        } 
  
        // Calculate minimized sum 
        long sum = 0; 
        for (int i = 0; i < n; i++) 
            sum += (x ^ a[i]); 
          
        // Print solution 
        Console.Write("X = " + x + ", Sum = " + sum); 
    } 
  
    // Driver Code 
    public static void Main(String[] args) 
    { 
        int[] a = {2, 3, 4, 5, 6}; 
        int n = a.Length; 
  
        findX(a, n); 
    } 
  
} 
  
// This code is contributed by ravikishor


输出:
X = 6, Sum = 14