📌  相关文章
📜  与K进行XOR运算后,数组元素的偶数和奇数设置位计数

📅  最后修改于: 2021-04-23 15:42:50             🧑  作者: Mango

给定一个数组arr []和一个数字K。任务是在将K与给定arr []的每个元素进行XOR运算后,找到具有设置位的奇数和偶数的元素的计数。

例子:

天真的方法:天真的方法是对给定数组arr []的每个元素进行K的按位异或,然后在对K进行XOR后对数组中的每个元素的置位数进行计数。

时间复杂度: O(N * K)

高效方法:
借助以下观察,我们可以:

从以上观察结果:

  • 如果K具有奇数个置位,则对K进行XOR后,具有偶数置位和奇数置位的数组arr []的元素数将与偶数置位和奇数的数相同在XOR之前将数组的位设置为int。
  • 如果K具有偶数个置位,则对K进行XOR后,具有偶数置位和奇数置位的数组arr []的元素计数将反转为偶数置位和奇数置位的计数XOR之前的数组中的-bit。

步骤

  1. 存储给定数组arr []中具有偶数位和奇数位的元素的计数。
  2. 如果K具有奇数位,则与K进行XOR运算后的偶数和奇数位的计数将与上面计算出的偶数和奇数位的计数相同。
  3. 如果K具有偶数置位,则与K进行XOR运算后的偶数和奇数置位的计数将是上面计算出的奇数和偶数置位的计数。

下面是上述方法的实现:

C++
// C++ program to count the set
// bits after taking XOR with a
// number K
#include 
using namespace std;
  
// Function to store EVEN and odd variable
void countEvenOdd(int arr[], int n, int K)
{
    int even = 0, odd = 0;
  
    // Store the count of even and
    // odd set bit
    for (int i = 0; i < n; i++) {
  
        // Count the set bit using
        // in built function
        int x = __builtin_popcount(arr[i]);
        if (x % 2 == 0)
            even++;
        else
            odd++;
    }
  
    int y;
  
    // Count of set-bit of K
    y = __builtin_popcount(K);
  
    // If y is odd then, count of
    // even and odd set bit will
    // be interchanged
    if (y & 1) {
        cout << "Even = " << odd
             << ", Odd = " << even;
    }
  
    // Else it will remain same as
    // the original array
    else {
        cout << "Even = " << even
             << ", Odd = " << odd;
    }
}
  
// Driver's Code
int main(void)
{
    int arr[] = { 4, 2, 15, 9, 8, 8 };
    int K = 3;
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // Function call to count even
    // and odd
    countEvenOdd(arr, n, K);
    return 0;
}


Java
// Java program to count the set
// bits after taking XOR with a
// number K
class GFG {
  
      
    /* Function to get no of set  
    bits in binary representation  
    of positive integer n */
    static int __builtin_popcount(int n) 
    { 
        int count = 0; 
        while (n > 0) { 
            count += n & 1; 
            n >>= 1; 
        } 
        return count; 
    }
      
    // Function to store EVEN and odd variable
    static void countEvenOdd(int arr[], int n, int K)
    {
        int even = 0, odd = 0;
      
        // Store the count of even and
        // odd set bit
        for (int i = 0; i < n; i++) {
      
            // Count the set bit using
            // in built function
            int x = __builtin_popcount(arr[i]);
            if (x % 2 == 0)
                even++;
            else
                odd++;
        }
      
        int y;
      
        // Count of set-bit of K
        y = __builtin_popcount(K);
      
        // If y is odd then, count of
        // even and odd set bit will
        // be interchanged
        if ((y & 1) != 0) {
            System.out.println("Even = "+ odd + ", Odd = " + even);
        }
      
        // Else it will remain same as
        // the original array
        else {
            System.out.println("Even = " + even + ", Odd = " + odd);
        }
    }
      
    // Driver's Code
    public static void main (String[] args)
    {
        int arr[] = { 4, 2, 15, 9, 8, 8 };
        int K = 3;
        int n = arr.length;
      
        // Function call to count even
        // and odd
        countEvenOdd(arr, n, K);
    }
   
}
// This code is contributed by Yash_R


Python3
# Python3 program to count the set 
# bits after taking XOR with a 
# number K 
  
# Function to store EVEN and odd variable 
def countEvenOdd(arr, n, K) : 
  
    even = 0; odd = 0; 
  
    # Store the count of even and 
    # odd set bit 
    for i in range(n) :
  
        # Count the set bit using 
        # in built function 
        x = bin(arr[i]).count('1'); 
        if (x % 2 == 0) :
            even += 1; 
        else :
            odd += 1; 
  
    # Count of set-bit of K 
    y = bin(K).count('1'); 
  
    # If y is odd then, count of 
    # even and odd set bit will 
    # be interchanged 
    if (y & 1) :
        print("Even =",odd ,", Odd =", even); 
  
    # Else it will remain same as 
    # the original array 
    else :
        print("Even =" , even ,", Odd =", odd); 
  
  
# Driver's Code 
if __name__ == "__main__" :
      
    arr = [ 4, 2, 15, 9, 8, 8 ]; 
    K = 3; 
    n = len(arr); 
  
    # Function call to count even 
    # and odd 
    countEvenOdd(arr, n, K); 
      
# This code is contributed by Yash_R


C#
// C# program to count the set
// bits after taking XOR with a
// number K
using System;
  
public class GFG {
  
      
    /* Function to get no of set  
    bits in binary representation  
    of positive integer n */
    static int __builtin_popcount(int n) 
    { 
        int count = 0; 
        while (n > 0) { 
            count += n & 1; 
            n >>= 1; 
        } 
        return count; 
    }
      
    // Function to store EVEN and odd variable
    static void countEvenOdd(int []arr, int n, int K)
    {
        int even = 0, odd = 0;
      
        // Store the count of even and
        // odd set bit
        for (int i = 0; i < n; i++) {
      
            // Count the set bit using
            // in built function
            int x = __builtin_popcount(arr[i]);
            if (x % 2 == 0)
                even++;
            else
                odd++;
        }
      
        int y;
      
        // Count of set-bit of K
        y = __builtin_popcount(K);
      
        // If y is odd then, count of
        // even and odd set bit will
        // be interchanged
        if ((y & 1) != 0) {
            Console.WriteLine("Even = "+ odd + ", Odd = " + even);
        }
      
        // Else it will remain same as
        // the original array
        else {
            Console.WriteLine("Even = " + even + ", Odd = " + odd);
        }
    }
      
    // Driver's Code
    public static void Main (string[] args)
    {
        int []arr = { 4, 2, 15, 9, 8, 8 };
        int K = 3;
        int n = arr.Length;
      
        // Function call to count even
        // and odd
        countEvenOdd(arr, n, K);
    }
   
}
// This code is contributed by Yash_R


输出:
Even = 2, Odd = 4

时间复杂度: O(N)