📌  相关文章
📜  与 K 异或后与数组元素的偶数和奇数设置位的计数

📅  最后修改于: 2021-10-25 06:25:32             🧑  作者: Mango

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

朴素的方法:朴素的方法是对K与给定数组arr[] 的每个元素进行按位异或,然后在与K进行异或后计算数组中每个元素的设置位。
时间复杂度: O(N*K)
有效的方法:
在以下观察的帮助下,我们有:

根据以上观察:

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

步骤

  1. 存储给定数组arr[] 中具有偶数设置位和奇数设置位的元素的计数。
  2. 如果K有奇数设置位,那么与 K 异或后的偶数和奇数设置位将与上面计算的偶数和奇数设置位相同。
  3. 如果K有偶数设置位,那么与 K 异或后的偶数和奇数设置位将是上面计算的奇数和偶数设置位。

下面是上述方法的实现:

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


Javascript


输出:
Even = 2, Odd = 4

时间复杂度: O(N)

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