给定的阵列ARR []由非负整数的,对于每个阵列元素ARR任务[i]是打印按位或所有对的总和(ARR [I],编曲[j]的)(0≤Ĵ≤ N )。
例子:
Input: arr[] = {1, 2, 3, 4}
Output: 12 14 16 22
Explanation:
For i = 0 the required sum will be (1 | 1) + (1 | 2) + (1 | 3) + (1 | 4) = 12
For i = 1 the required sum will be (2 | 1) + (2 | 2) + (2 | 3) + (2 | 4) = 14
For i = 2 the required sum will be (3 | 1) + (3 | 2) + (3 | 3) + (3 | 4) = 16
For i = 3 the required sum will be (4 | 1) + (4 | 2) + (4 | 3) + (4 | 4) = 22
Input: arr[] = {3, 2, 5, 4, 8}
Output: 31 28 37 34 54
天真的方法:对于每个数组元素arr [i]而言,最简单的方法是遍历数组并计算所有可能值(arr [i],arr [j])的按位“或”并打印获得的和。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to print required sum for
// every valid index i
void printORSumforEachElement(int arr[], int N)
{
for (int i = 0; i < N; i++) {
// Store the required sum
// for current array element
int req_sum = 0;
// Generate all possible pairs (arr[i], arr[j])
for (int j = 0; j < N; j++) {
// Update the value of req_sum
req_sum += (arr[i] | arr[j]);
}
// Print the required sum
cout << req_sum << " ";
}
}
// Driver Code
int main()
{
// Given array
int arr[] = { 1, 2, 3, 4 };
// Size of the array
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
printORSumforEachElement(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG
{
// Function to print required sum for
// every valid index i
static void printORSumforEachElement(int arr[], int N)
{
for (int i = 0; i < N; i++)
{
// Store the required sum
// for current array element
int req_sum = 0;
// Generate all possible pairs (arr[i], arr[j])
for (int j = 0; j < N; j++)
{
// Update the value of req_sum
req_sum += (arr[i] | arr[j]);
}
// Print the required sum
System.out.print(req_sum+ " ");
}
}
// Driver Code
public static void main(String[] args)
{
// Given array
int arr[] = { 1, 2, 3, 4 };
// Size of the array
int N = arr.length;
// Function Call
printORSumforEachElement(arr, N);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program for the above approach
# Function to print required sum for
# every valid index i
def printORSumforEachElement(arr, N):
for i in range(0, N):
# Store the required sum
# for current array element
req_sum = 0
# Generate all possible pairs(arr[i],arr[j])
for j in range(0, N):
# Update the value of req_sum
req_sum += (arr[i] | arr[j])
# Print required sum
print(req_sum, end = " ")
# Driver code
# Given array
arr = [ 1, 2, 3, 4 ]
# Size of array
N = len(arr)
# Function call
printORSumforEachElement(arr, N)
# This code is contributed by Virusbuddah
C#
// C# program for the above approach
using System;
public class GFG
{
// Function to print required sum for
// every valid index i
static void printORSumforEachElement(int []arr, int N)
{
for (int i = 0; i < N; i++)
{
// Store the required sum
// for current array element
int req_sum = 0;
// Generate all possible pairs (arr[i], arr[j])
for (int j = 0; j < N; j++)
{
// Update the value of req_sum
req_sum += (arr[i] | arr[j]);
}
// Print the required sum
Console.Write(req_sum+ " ");
}
}
// Driver Code
public static void Main(String[] args)
{
// Given array
int []arr = { 1, 2, 3, 4 };
// Size of the array
int N = arr.Length;
// Function Call
printORSumforEachElement(arr, N);
}
}
// This code is contributed by 29AjayKumar
C++
// C++ program for the above approach
#include
using namespace std;
// Function to print required sum for
// every valid index i
void printORSumforEachElement(int arr[], int N)
{
// Frequency array to store frequency
// of every k-th bit
int freq[32];
// Initialize frequency array
memset(freq, 0, sizeof freq);
for (int i = 0; i < N; i++) {
for (int k = 0; k < 32; k++) {
// If k-th bit is set, then update
// the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0)
freq[k]++;
}
}
for (int i = 0; i < N; i++) {
// Stores the required sum
// for the current array element
int req_sum = 0;
for (int k = 0; k < 32; k++) {
// If k-th bit is set
if ((arr[i] & (1 << k)) != 0)
req_sum += (1 << k) * N;
// If k-th bit is not set
else
req_sum += (1 << k) * freq[k];
}
// Print the required sum
cout << req_sum << " ";
}
}
// Driver Code
int main()
{
// Given array
int arr[] = { 1, 2, 3, 4 };
// Size of the array
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
printORSumforEachElement(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG
{
// Function to print required sum for
// every valid index i
static void printORSumforEachElement(int arr[], int N)
{
// Frequency array to store frequency
// of every k-th bit
int []freq = new int[32];
for (int i = 0; i < N; i++)
{
for (int k = 0; k < 32; k++)
{
// If k-th bit is set, then update
// the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0)
freq[k]++;
}
}
for (int i = 0; i < N; i++)
{
// Stores the required sum
// for the current array element
int req_sum = 0;
for (int k = 0; k < 32; k++)
{
// If k-th bit is set
if ((arr[i] & (1 << k)) != 0)
req_sum += (1 << k) * N;
// If k-th bit is not set
else
req_sum += (1 << k) * freq[k];
}
// Print the required sum
System.out.print(req_sum+ " ");
}
}
// Driver Code
public static void main(String[] args)
{
// Given array
int arr[] = { 1, 2, 3, 4 };
// Size of the array
int N = arr.length;
// Function Call
printORSumforEachElement(arr, N);
}
}
// This code is contributed by shikhasingrajput
Python3
# Python3 program for the above approach
# Function to print required sum for
# every valid index i
def printORSumforEachElement(arr, N):
# Frequency array to store frequency
# of every k-th bit
freq = [0 for i in range(32)]
for i in range(N):
for k in range(32):
# If k-th bit is set, then update
# the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0):
freq[k] += 1
for i in range(N):
# Stores the required sum
# for the current array element
req_sum = 0
for k in range(32):
# If k-th bit is set
if ((arr[i] & (1 << k)) != 0):
req_sum += (1 << k) * N
# If k-th bit is not set
else:
req_sum += (1 << k) * freq[k]
# Print the required sum
print(req_sum, end = " ")
# Driver Code
if __name__ == '__main__':
# Given array
arr = [ 1, 2, 3, 4 ]
# Size of the array
N = len(arr)
# Function Call
printORSumforEachElement(arr, N)
# This code is contributed by SURENDRA_GANGWAR
C#
// C# program for the above approach
using System;
class GFG
{
// Function to print required sum for
// every valid index i
static void printORSumforEachElement(int[] arr, int N)
{
// Frequency array to store frequency
// of every k-th bit
int[] freq = new int[32];
for (int i = 0; i < N; i++)
{
for (int k = 0; k < 32; k++)
{
// If k-th bit is set, then update
// the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0)
freq[k]++;
}
}
for (int i = 0; i < N; i++)
{
// Stores the required sum
// for the current array element
int req_sum = 0;
for (int k = 0; k < 32; k++)
{
// If k-th bit is set
if ((arr[i] & (1 << k)) != 0)
req_sum += (1 << k) * N;
// If k-th bit is not set
else
req_sum += (1 << k) * freq[k];
}
// Print the required sum
Console.Write(req_sum + " ");
}
}
// Driver Code
public static void Main()
{
// Given array
int[] arr = { 1, 2, 3, 4 };
// Size of the array
int N = arr.Length;
// Function Call
printORSumforEachElement(arr, N);
}
}
// This code is contributed by chitranayal.
12 14 16 22
时间复杂度: O(N 2 )
辅助空间: O(1)
高效的方法:最佳方法是通过使用32位表示整数的假设来使用位操作。请按照以下步骤解决问题:
- 考虑每个第k位,并使用频率数组freq []存储设置了第k位的元素的计数。
- 对于每个数组元素,检查是否设置了该元素的第k位。如果设置了第k位,则只需增加第k位的频率即可。
- 横移 的阵列和用于每个元素ARR [I]确认第k ARR的位[I]是否被设定或没有。
- 将每个索引i的所需总和初始化为0 。
- 如果arr [i]的第k位被置位,则意味着每个可能的第k位(arr [i] | arr [j])也将被置位。因此,在这种情况下,将(1 << k)* N添加到所需的总和中。
- 否则,如果没有设置ARR [I]的k个比特,则意味着第k个位(ARR [I] |的常用3 [j]的)将被设置当且仅当ARR的第k位[J ]设置。因此,在这种情况下,将(1 << k)* freq [k]添加到所需的总和,该总和是先前计算出的第k位被设置为freq [k]个元素的数量。
- 最后,打印索引i所需总和的值。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to print required sum for
// every valid index i
void printORSumforEachElement(int arr[], int N)
{
// Frequency array to store frequency
// of every k-th bit
int freq[32];
// Initialize frequency array
memset(freq, 0, sizeof freq);
for (int i = 0; i < N; i++) {
for (int k = 0; k < 32; k++) {
// If k-th bit is set, then update
// the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0)
freq[k]++;
}
}
for (int i = 0; i < N; i++) {
// Stores the required sum
// for the current array element
int req_sum = 0;
for (int k = 0; k < 32; k++) {
// If k-th bit is set
if ((arr[i] & (1 << k)) != 0)
req_sum += (1 << k) * N;
// If k-th bit is not set
else
req_sum += (1 << k) * freq[k];
}
// Print the required sum
cout << req_sum << " ";
}
}
// Driver Code
int main()
{
// Given array
int arr[] = { 1, 2, 3, 4 };
// Size of the array
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
printORSumforEachElement(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG
{
// Function to print required sum for
// every valid index i
static void printORSumforEachElement(int arr[], int N)
{
// Frequency array to store frequency
// of every k-th bit
int []freq = new int[32];
for (int i = 0; i < N; i++)
{
for (int k = 0; k < 32; k++)
{
// If k-th bit is set, then update
// the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0)
freq[k]++;
}
}
for (int i = 0; i < N; i++)
{
// Stores the required sum
// for the current array element
int req_sum = 0;
for (int k = 0; k < 32; k++)
{
// If k-th bit is set
if ((arr[i] & (1 << k)) != 0)
req_sum += (1 << k) * N;
// If k-th bit is not set
else
req_sum += (1 << k) * freq[k];
}
// Print the required sum
System.out.print(req_sum+ " ");
}
}
// Driver Code
public static void main(String[] args)
{
// Given array
int arr[] = { 1, 2, 3, 4 };
// Size of the array
int N = arr.length;
// Function Call
printORSumforEachElement(arr, N);
}
}
// This code is contributed by shikhasingrajput
Python3
# Python3 program for the above approach
# Function to print required sum for
# every valid index i
def printORSumforEachElement(arr, N):
# Frequency array to store frequency
# of every k-th bit
freq = [0 for i in range(32)]
for i in range(N):
for k in range(32):
# If k-th bit is set, then update
# the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0):
freq[k] += 1
for i in range(N):
# Stores the required sum
# for the current array element
req_sum = 0
for k in range(32):
# If k-th bit is set
if ((arr[i] & (1 << k)) != 0):
req_sum += (1 << k) * N
# If k-th bit is not set
else:
req_sum += (1 << k) * freq[k]
# Print the required sum
print(req_sum, end = " ")
# Driver Code
if __name__ == '__main__':
# Given array
arr = [ 1, 2, 3, 4 ]
# Size of the array
N = len(arr)
# Function Call
printORSumforEachElement(arr, N)
# This code is contributed by SURENDRA_GANGWAR
C#
// C# program for the above approach
using System;
class GFG
{
// Function to print required sum for
// every valid index i
static void printORSumforEachElement(int[] arr, int N)
{
// Frequency array to store frequency
// of every k-th bit
int[] freq = new int[32];
for (int i = 0; i < N; i++)
{
for (int k = 0; k < 32; k++)
{
// If k-th bit is set, then update
// the frequency of k-th bit
if ((arr[i] & (1 << k)) != 0)
freq[k]++;
}
}
for (int i = 0; i < N; i++)
{
// Stores the required sum
// for the current array element
int req_sum = 0;
for (int k = 0; k < 32; k++)
{
// If k-th bit is set
if ((arr[i] & (1 << k)) != 0)
req_sum += (1 << k) * N;
// If k-th bit is not set
else
req_sum += (1 << k) * freq[k];
}
// Print the required sum
Console.Write(req_sum + " ");
}
}
// Driver Code
public static void Main()
{
// Given array
int[] arr = { 1, 2, 3, 4 };
// Size of the array
int N = arr.Length;
// Function Call
printORSumforEachElement(arr, N);
}
}
// This code is contributed by chitranayal.
12 14 16 22
时间复杂度: O(32 * N)
辅助空间: O(m),其中m = 32