给定两个大小为M 的数组arr1[]和大小为N 的arr2[] ,任务是找到arr1[]的每个元素与数组arr2[]的元素的按位与之和。
例子:
Input: arr1[] = {1, 2, 3}, arr2[] = {1, 2, 3}, M = 3, N = 3
Output: 2 4 6
Explanation:
For elements at index 0 in arr1[], Sum = arr1[0] & arr2[0] + arr1[0] & arr2[1] + arr1[0] & arr2[2], Sum = 1 & 1 + 1 & 2 + 1 & 3 = 2
For elements at index 1 in arr1[], Sum = arr1[1] & arr2[0] + arr1[1] & arr2[1] + arr1[1] & arr2[2], Sum= 2 & 1 + 2 & 2 + 2 & 3 = 4
For elements at index 2 in arr1[], Sum = arr1[2] & arr2[0] + arr1[2] & arr2[1] + arr1[2] & arr2[2], Sum= 3 & 1 + 3 & 2 + 3 & 3 = 6
Input: arr1[] = {2, 4, 8, 16}, arr2[] = {2, 4, 8, 16}, M = 4, N = 4
Output: 2 4 8 16
简单方法:解决该问题的最简单的方法是遍历数组ARR1 []和用于阵列ARR1 []中的每个元素,遍历数组ARR2 [],并计算按位之和ARR1的当前元素[]每个元素都有arr2[]的所有元素
时间复杂度: O(N 2 )
辅助空间: O(N)
高效方法:思路是使用位操作来解决上述问题。假设数组的每个元素只能用32位表示。
- 根据按位和财产,执行操作时,第i位将被置位 只有当两个数字都有 设置位在 第i个位置,其中0≤i<32 。
- 因此,对于在ARR1 []的数,如果该第i个比特是置位的位,则第i个位置将有助于K的总和* 2 i,其中K是数字的ARR2总数[]已经设置的少量 在第i个位置。
请按照以下步骤解决问题:
- 初始化整数数组frequency[]以存储arr2[]中的数字计数,并在第i个位置设置了位,其中0≤i<32
- 遍历数组arr2[]并为每个元素以二进制形式表示它,并将frequency[]数组中的计数在二进制表示中具有1的位置增加1 。
- 遍历数组arr1[]
- 用0初始化整数变量bitwise_AND_sum 。
- 使用变量j在范围[0, 31] 中遍历。
- 如果第j位被设置为位在ARR2的二进制表示[I]通过频率[j]的* 2焦耳然后增量bitwise_AND_sum。
- 打印获得的总和,即bitwise_AND_sum 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to compute the AND sum
// for each element of an array
void Bitwise_AND_sum_i(int arr1[], int arr2[], int M, int N)
{
// Declaring an array of
// size 32 for storing the
// count of each bit
int frequency[32] = { 0 };
// Traverse the array arr2[]
// and store the count of a
// bit in frequency array
for (int i = 0; i < N; i++) {
// Current bit position
int bit_position = 0;
int num = arr1[i];
// While num is greater
// than 0
while (num) {
// Checks if ith bit is
// set or not
if (num & 1) {
// Increment the count of
// bit by one
frequency[bit_position] += 1;
}
// Increment the bit position
// by one
bit_position += 1;
// Right shift the num by one
num >>= 1;
}
}
// Traverse in the arr2[]
for (int i = 0; i < M; i++) {
int num = arr2[i];
// Store the ith bit
// value
int value_at_that_bit = 1;
// Total required sum
int bitwise_AND_sum = 0;
// Traverse in the range [0, 31]
for (int bit_position = 0; bit_position < 32;
bit_position++) {
// Checks if current bit is set
if (num & 1) {
// Increment the bitwise sum
// by frequency[bit_position]
// * value_at_that_bit;
bitwise_AND_sum += frequency[bit_position]
* value_at_that_bit;
}
// Right shift num by one
num >>= 1;
// Left shift vale_at_that_bit by one
value_at_that_bit <<= 1;
}
// Print the sum obtained for ith
// number in arr1[]
cout << bitwise_AND_sum << ' ';
}
return;
}
// Driver Code
int main()
{
// Given arr1[]
int arr1[] = { 1, 2, 3 };
// Given arr2[]
int arr2[] = { 1, 2, 3 };
// Size of arr1[]
int N = sizeof(arr1) / sizeof(arr1[0]);
// Size of arr2[]
int M = sizeof(arr2) / sizeof(arr2[0]);
// Function Call
Bitwise_AND_sum_i(arr1, arr2, M, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG
{
// Driver Code
public static void main(String[] args)
{
// Given arr1[]
int[] arr1 = { 1, 2, 3 };
// Given arr2[]
int[] arr2 = { 1, 2, 3 };
// Size of arr1[]
int N = arr1.length;
// Size of arr2[]
int M = arr2.length;
// Function Call
Bitwise_AND_sum_i(arr1, arr2, M, N);
}
// Function to compute the AND sum
// for each element of an array
static void Bitwise_AND_sum_i(int arr1[], int arr2[],
int M, int N)
{
// Declaring an array of
// size 32 for storing the
// count of each bit
int[] frequency = new int[32];
// Traverse the array arr2[]
// and store the count of a
// bit in frequency array
for (int i = 0; i < N; i++)
{
// Current bit position
int bit_position = 0;
int num = arr1[i];
// While num is greater
// than 0
while (num != 0)
{
// Checks if ith bit is
// set or not
if ((num & 1) != 0)
{
// Increment the count of
// bit by one
frequency[bit_position] += 1;
}
// Increment the bit position
// by one
bit_position += 1;
// Right shift the num by one
num >>= 1;
}
}
// Traverse in the arr2[]
for (int i = 0; i < M; i++)
{
int num = arr2[i];
// Store the ith bit
// value
int value_at_that_bit = 1;
// Total required sum
int bitwise_AND_sum = 0;
// Traverse in the range [0, 31]
for (int bit_position = 0; bit_position < 32;
bit_position++)
{
// Checks if current bit is set
if ((num & 1) != 0)
{
// Incremen the bitwise sum
// by frequency[bit_position]
// * value_at_that_bit;
bitwise_AND_sum
+= frequency[bit_position]
* value_at_that_bit;
}
// Right shift num by one
num >>= 1;
// Left shift vale_at_that_bit by one
value_at_that_bit <<= 1;
}
// Print the sum obtained for ith
// number in arr1[]
System.out.print( bitwise_AND_sum + " ");
}
}
}
// This code is contributed by Dharanendra L V
Python3
# Python3 program for the above approach
# Function to compute the AND sum
# for each element of an array
def Bitwise_AND_sum_i(arr1, arr2, M, N):
# Declaring an array of
# size 32 for storing the
# count of each bit
frequency = [0]*32
# Traverse the array arr2[]
# and store the count of a
# bit in frequency array
for i in range(N):
# Current bit position
bit_position = 0
num = arr1[i]
# While num is greater
# than 0
while (num):
# Checks if ith bit is
# set or not
if (num & 1):
# Increment the count of
# bit by one
frequency[bit_position] += 1
# Increment the bit position
# by one
bit_position += 1
# Right shift the num by one
num >>= 1
# Traverse in the arr2[]
for i in range(M):
num = arr2[i]
# Store the ith bit
# value
value_at_that_bit = 1
# Total required sum
bitwise_AND_sum = 0
# Traverse in the range [0, 31]
for bit_position in range(32):
# Checks if current bit is set
if (num & 1):
# Increment the bitwise sum
# by frequency[bit_position]
# * value_at_that_bit
bitwise_AND_sum += frequency[bit_position] * value_at_that_bit
# Right shift num by one
num >>= 1
# Left shift vale_at_that_bit by one
value_at_that_bit <<= 1
# Prthe sum obtained for ith
# number in arr1[]
print(bitwise_AND_sum, end = " ")
return
# Driver Code
if __name__ == '__main__':
# Given arr1[]
arr1 = [1, 2, 3]
# Given arr2
arr2 = [1, 2, 3]
# Size of arr1[]
N = len(arr1)
# Size of arr2[]
M = len(arr2)
# Function Call
Bitwise_AND_sum_i(arr1, arr2, M, N)
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
class GFG
{
// Driver code
static public void Main()
{
// Given arr1[]
int[] arr1 = { 1, 2, 3 };
// Given arr2[]
int[] arr2 = { 1, 2, 3 };
// Size of arr1[]
int N = arr1.Length;
// Size of arr2[]
int M = arr2.Length;
// Function Call
Bitwise_AND_sum_i(arr1, arr2, M, N);
}
// Function to compute the AND sum
// for each element of an array
static void Bitwise_AND_sum_i(int[] arr1, int[] arr2,
int M, int N)
{
// Declaring an array of
// size 32 for storing the
// count of each bit
int[] frequency = new int[32];
// Traverse the array arr2[]
// and store the count of a
// bit in frequency array
for (int i = 0; i < N; i++)
{
// Current bit position
int bit_position = 0;
int num = arr1[i];
// While num is greater
// than 0
while (num != 0)
{
// Checks if ith bit is
// set or not
if ((num & 1) != 0)
{
// Increment the count of
// bit by one
frequency[bit_position] += 1;
}
// Increment the bit position
// by one
bit_position += 1;
// Right shift the num by one
num >>= 1;
}
}
// Traverse in the arr2[]
for (int i = 0; i < M; i++)
{
int num = arr2[i];
// Store the ith bit
// value
int value_at_that_bit = 1;
// Total required sum
int bitwise_AND_sum = 0;
// Traverse in the range [0, 31]
for (int bit_position = 0; bit_position < 32;
bit_position++) {
// Checks if current bit is set
if ((num & 1) != 0)
{
// Incremen the bitwise sum
// by frequency[bit_position]
// * value_at_that_bit;
bitwise_AND_sum
+= frequency[bit_position]
* value_at_that_bit;
}
// Right shift num by one
num >>= 1;
// Left shift vale_at_that_bit by one
value_at_that_bit <<= 1;
}
// Print the sum obtained for ith
// number in arr1[]
Console.Write(bitwise_AND_sum + " ");
}
}
}
// The code is contributed by Dharanendra L V
Javascript
2 4 6
时间复杂度: O(N * 32)
辅助空间: O(N * 32)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。