给定一个数组arr []和一个数字K。任务是在将K与给定arr []的每个元素进行XOR运算后,找到具有设置位的奇数和偶数的元素的计数。
例子:
Input: arr[] = {4, 2, 15, 9, 8, 8}, K = 3
Output: Even = 2, Odd = 4
Explanation:
The binary representation of the element after taking XOR with K are:
4 ^ 3 = 7 (111)
2 ^ 3 = 1 (1)
15 ^ 3 = 12 (1100)
9 ^ 3 = 10 (1010)
8 ^ 3 = 11 (1011)
8 ^ 3 = 11 (1011)
No of elements with even no of 1’s in binary representation : 2 (12, 10)
No of elements with odd no of 1’s in binary representation : 4 (7, 1, 11, 11)
Input: arr[] = {4, 2, 15, 9, 8, 8}, K = 6
Output: Even = 4, Odd = 2
天真的方法:天真的方法是对给定数组arr []的每个元素进行K的按位异或,然后在对K进行XOR后对数组中的每个元素的置位数进行计数。
时间复杂度: O(N * K)
高效方法:
借助以下观察,我们可以:
For Example:
If A = 4 and K = 3
Binary Representation:
A = 100
K = 011
A^K = 111
Therefore, the XOR of number A(which has an odd number of set-bit) with the number K(which has an even number of set-bit) results in an odd number of set-bit.
And If A = 4 and K = 7
Binary Representation:
A = 100
K = 111
A^K = 011
Therefore, the XOR of number A(which has an odd number of set-bit) with the number K(which has an odd number of set-bit) results in an even number of set-bit.
从以上观察结果:
- 如果K具有奇数个置位,则对K进行XOR后,具有偶数置位和奇数置位的数组arr []的元素数将与偶数置位和奇数的数相同在XOR之前将数组的位设置为int。
- 如果K具有偶数个置位,则对K进行XOR后,具有偶数置位和奇数置位的数组arr []的元素计数将反转为偶数置位和奇数置位的计数XOR之前的数组中的-bit。
步骤:
- 存储给定数组arr []中具有偶数位和奇数位的元素的计数。
- 如果K具有奇数位,则与K进行XOR运算后的偶数和奇数位的计数将与上面计算出的偶数和奇数位的计数相同。
- 如果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)