给定一个数组arr[]和一个数字K 。任务是在对给定的arr[] 的每个元素进行K 的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
朴素的方法:朴素的方法是对K与给定数组arr[] 的每个元素进行按位异或,然后在与K进行异或后计算数组中每个元素的设置位。
时间复杂度: 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进行异或后,数组arr[]的偶设置位和奇设置位的元素计数将与偶设置位和奇数的计数相同在 XOR 之前设置数组的位 int。
- 如果K的设置位为偶数,则与K进行异或后,数组arr[]中偶数设置位和奇数设置位的元素计数将反转为偶数设置位和奇数集的计数-bit 在 XOR 之前的数组中。
步骤:
- 存储给定数组arr[] 中具有偶数设置位和奇数设置位的元素的计数。
- 如果K有奇数设置位,那么与 K 异或后的偶数和奇数设置位将与上面计算的偶数和奇数设置位相同。
- 如果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 现场工作专业课程和学生竞争性编程现场课程。