给定两个大小为M的数组arr1 []和大小为N的arr2 [] ,任务是找到arr1 []的每个元素与数组arr2 []的每个元素按位或的总和。
例子:
Input: arr1[] = {1, 2, 3}, arr2[] = {1, 2, 3}, M = 3, N = 3
Output: 7 8 9
Explanation:
For arr[0]: Sum = arr1[0]|arr2[0] + arr1[0]|arr2[1] + arr1[0]|arr2[2], Sum = 1|1 + 1|2 + 1|3 = 7
For arr[1], Sum = arr1[1]|arr2[0] + arr1[1]|arr2[1] + arr1[1]|arr2[2], Sum= 2|1 + 2|2 + 2|3 = 8
For arr[2], Sum = arr1[2]|arr2[0] + arr1[2]|arr2[1] + arr1[2]|arr2[2], Sum = 3|1 + 3|2 + 3|3 = 9
Input: arr1[] = {2, 4, 8, 16}, arr2[] = {2, 4, 8, 16}, M = 4, N = 4
Output: 36 42 54 78
天真的方法:解决该问题的最简单方法是遍历数组arr1 [] ,并对数组arr []中的每个数组元素,计算数组arr2 []中的每个元素按位或。
时间复杂度: O(N 2 )
辅助空间: O(N)
高效方法:为了优化上述方法,其思想是使用位操作来解决上述问题。
- 根据按位或属性,在执行操作时,仅当两个数字中的任何一个都有置位时,第i个位才被置位。 第i个位置,其中0≤i <32 。
- 因此,对于在ARR1 []的数,如果第i位不是一组位,则第i个位置将有助于K的总和* 2 i,其中K是在ARR2 []具有置位的位在总数第i个位置。
- 否则,如果该数字在第i个位置具有设置位,则它将贡献N * 2 i的总和。
请按照以下步骤解决问题:
- 初始化一个整数数组,即frequency [] ,以将数字的计数存储在第i个位置(0≤i <32)具有置位的arr2 []中。
- 遍历数组arr2 []并以其二进制形式表示每个数组元素,并在二进制表示中已设置位置的位置上将frequency []数组中的计数加1。
- 遍历数组arr1 [] 。
- 初始化一个整数变量,用0表示bitwise_OR_sum 。
- 使用变量j在[0,31]范围内遍历。
- 如果在arr2 [i]的二进制表示中设置了第j位,则将bitwise_OR_sum递增N * 2 j 。否则,按频率增加[j] * 2 j
- 打印获得的总和bitwise_OR_sum 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Fucntion to compute sum of Bitwise OR
// of each element in arr1[] with all
// elements of the array arr2[]
void Bitwise_OR_sum_i(int arr1[], int arr2[],
int M, int N)
{
// Decalring an array of
// size 32 to store the
// count of each bit
int frequency[32] = { 0 };
// Traverse the array arr1[]
for (int i = 0; i < N; i++) {
// Current bit position
int bit_position = 0;
int num = arr1[i];
// While num exceeds 0
while (num) {
// Checks if i-th bit
// is set or not
if (num & 1) {
// Increment the count at
// bit_position by one
frequency[bit_position] += 1;
}
// Increment bit_position
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_OR_sum = 0;
// Traverse in the range [0, 31]
for (int bit_position = 0;
bit_position < 32;
bit_position++) {
// Check if current bit is set
if (num & 1) {
// Incremen the Bitwise
// sum by N*(2^i)
bitwise_OR_sum
+= N * value_at_that_bit;
}
else {
bitwise_OR_sum
+= frequency[bit_position]
* value_at_that_bit;
}
// Right shift num by one
num >>= 1;
// Left shift valee_at_that_bit by one
value_at_that_bit <<= 1;
}
// Print the sum obtained for ith
// number in arr1[]
cout << bitwise_OR_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_OR_sum_i(arr1, arr2, M, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Fucntion to compute sum of Bitwise OR
// of each element in arr1[] with all
// elements of the array arr2[]
static void Bitwise_OR_sum_i(int arr1[], int arr2[],
int M, int N)
{
// Decalring an array of
// size 32 to store the
// count of each bit
int frequency[] = new int[32];
Arrays.fill(frequency, 0);
// Traverse the array arr1[]
for(int i = 0; i < N; i++)
{
// Current bit position
int bit_position = 0;
int num = arr1[i];
// While num exceeds 0
while (num != 0)
{
// Checks if i-th bit
// is set or not
if ((num & 1) != 0)
{
// Increment the count at
// bit_position by one
frequency[bit_position] += 1;
}
// Increment bit_position
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_OR_sum = 0;
// Traverse in the range [0, 31]
for(int bit_position = 0;
bit_position < 32;
bit_position++)
{
// Check if current bit is set
if ((num & 1) != 0)
{
// Incremen the Bitwise
// sum by N*(2^i)
bitwise_OR_sum += N * value_at_that_bit;
}
else
{
bitwise_OR_sum += frequency[bit_position] *
value_at_that_bit;
}
// Right shift num by one
num >>= 1;
// Left shift valee_at_that_bit by one
value_at_that_bit <<= 1;
}
// Print the sum obtained for ith
// number in arr1[]
System.out.print(bitwise_OR_sum + " ");
}
return;
}
// 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_OR_sum_i(arr1, arr2, M, N);
}
}
// This code is contributed by susmitakundugoaldanga
Python3
# Python3 program for the above approach
# Fucntion to compute sum of Bitwise OR
# of each element in arr1[] with all
# elements of the array arr2[]
def Bitwise_OR_sum_i(arr1, arr2, M, N):
# Decalring an array of
# size 32 to store the
# count of each bit
frequency = [0] * 32
# Traverse the array arr1[]
for i in range(N):
# Current bit position
bit_position = 0
num = arr1[i]
# While num exceeds 0
while (num):
# Checks if i-th bit
# is set or not
if (num & 1 != 0):
# Increment the count at
# bit_position by one
frequency[bit_position] += 1
# Increment bit_position
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_OR_sum = 0
# Traverse in the range [0, 31]
for bit_position in range(32):
# Check if current bit is set
if (num & 1 != 0):
# Incremen the Bitwise
# sum by N*(2^i)
bitwise_OR_sum += N * value_at_that_bit
else:
bitwise_OR_sum += (frequency[bit_position] *
value_at_that_bit)
# Right shift num by one
num >>= 1
# Left shift valee_at_that_bit by one
value_at_that_bit <<= 1
# Print the sum obtained for ith
# number in arr1[]
print(bitwise_OR_sum, end = " ")
return
# Driver Code
# 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_OR_sum_i(arr1, arr2, M, N)
# This code is contributed by code_hunt
C#
// C# program for the above approach
using System;
class GFG
{
// Fucntion to compute sum of Bitwise OR
// of each element in arr1[] with all
// elements of the array arr2[]
static void Bitwise_OR_sum_i(int[] arr1, int[] arr2,
int M, int N)
{
// Decalring an array of
// size 32 to store the
// count of each bit
int[] frequency = new int[32];
for(int i = 0; i < 32; i++)
{
frequency[i] = 0;
}
// Traverse the array arr1[]
for(int i = 0; i < N; i++)
{
// Current bit position
int bit_position = 0;
int num = arr1[i];
// While num exceeds 0
while (num != 0)
{
// Checks if i-th bit
// is set or not
if ((num & 1) != 0)
{
// Increment the count at
// bit_position by one
frequency[bit_position] += 1;
}
// Increment bit_position
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_OR_sum = 0;
// Traverse in the range [0, 31]
for(int bit_position = 0;
bit_position < 32;
bit_position++)
{
// Check if current bit is set
if ((num & 1) != 0)
{
// Incremen the Bitwise
// sum by N*(2^i)
bitwise_OR_sum += N * value_at_that_bit;
}
else
{
bitwise_OR_sum += frequency[bit_position] *
value_at_that_bit;
}
// Right shift num by one
num >>= 1;
// Left shift valee_at_that_bit by one
value_at_that_bit <<= 1;
}
// Print the sum obtained for ith
// number in arr1[]
Console.Write(bitwise_OR_sum + " ");
}
return;
}
// Driver Code
public static 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_OR_sum_i(arr1, arr2, M, N);
}
}
// This code is contributed by sanjoy_62
7 8 9
时间复杂度: O(N * 32)
辅助空间: O(N * 32)