给定一个由N个正整数组成的数组arr [] ,任务是查找数组中具有不同设置位计数的所有数组元素的总和。
例子:
Input: arr[] = {8, 3, 7, 5, 3}
Output: 15
Explanation:
The count of set bits in each array elements are:
- arr[0] = 8 = (1000)2, has 1 set bits.
- arr[1] = 3 = (11)2, has 2 set bits.
- arr[2] = 7 = (111)2, has 3 set bits.
- arr[3] = 5 = (101)2, has 2 set bits.
- arr[4] = 3 = (11)2, has 2 set bits.
Therefore, the number of array elements whose count of set bits are unique are 8 and 7. Therefore, required sum = 8 + 7 = 15.
Input: arr[] = {4, 5, 3, 5, 3, 2}
Output: 0
方法:想法是将具有相应的设置位计数的元素存储在映射中,然后找到具有唯一的设置位计数的元素之和。请按照以下步骤解决问题:
- 初始化一个变量,例如sum,以存储元素的总和;以及一个Map,例如M ,其存储具有特定计数的设置位的元素。
- 遍历数组arr []并根据设置的位数将元素arr [i]存储在Map M中。
- 现在,遍历该映射,如果任何设置的位计数的频率为1,则将与之关联的对应值添加到变量sum中。
- 完成上述步骤后,打印总和的值作为结果。
下面是上述方法的实现:
C++
// C++ program for the approach
#include
#include
using namespace std;
// Function to count the number
// of set bits in an integer N
int setBitCount(int n)
{
// Stores the count of set bits
int ans = 0;
// Iterate until N is non-zero
while (n)
{
ans += n & 1;
n >>= 1;
}
// Stores the resultant count
return ans;
}
// Function to calculate sum of all array
// elements whose count of set bits are unique
int getSum(int *arr, int n)
{
// Stores frequency of all possible
// count of set bits
map mp;
// Stores the sum of array elements
int ans = 0;
// Traverse the array
for(int i = 0; i < n; i++)
{
// Count the number of set bits
int key = setBitCount(arr[i]);
mp[key] += 1;
}
// Traverse the array
// And Update the value of ans
for(int i = 0; i < n; i++)
{
int key = setBitCount(arr[i]);
// If frequency is 1
if (mp[key] == 1)
ans += arr[i];
}
cout << ans;
}
// Driver Code
int main()
{
int arr[5] = {8, 3, 7, 5, 3};
int n = sizeof(arr) / sizeof(arr[0]);
getSum(arr, n);
return 0;
}
// This code is contributed by rohitsingh07052
Java
// Java program for the approach
import java.util.*;
class GFG
{
// Function to count the number
// of set bits in an integer N
static int setBitCount(int n)
{
// Stores the count of set bits
int ans = 0;
// Iterate until N is non-zero
while (n != 0)
{
ans += n & 1;
n >>= 1;
}
// Stores the resultant count
return ans;
}
// Function to calculate sum of all array
// elements whose count of set bits are unique
static void getSum(int []arr, int n)
{
// Stores frequency of all possible
// count of set bits
Map mp = new HashMap();
// Stores the sum of array elements
int ans = 0;
// Traverse the array
for(int i = 0; i < n; i++)
{
// Count the number of set bits
int key = setBitCount(arr[i]);
if(mp.containsKey(key))
mp.put(key,mp.get(key) + 1);
else
mp.put(key, 1);
}
// Traverse the array
// And Update the value of ans
for(int i = 0; i < n; i++)
{
int key = setBitCount(arr[i]);
// If frequency is 1
if (mp.containsKey(key) && mp.get(key) == 1)
ans += arr[i];
}
System.out.print(ans);
}
// Driver Code
public static void main(String args[])
{
int []arr = {8, 3, 7, 5, 3};
int n = arr.length;
getSum(arr, n);
}
}
// This code is contributed by SURENDRA_GANGWAR.
Python3
# Python3 program for the approach
# Function to count the number
# of set bits in an integer N
def setBitCount(n):
# Stores the count of set bits
ans = 0
# Iterate until N is non-zero
while n:
ans += n & 1
n >>= 1
# Stores the resultant count
return ans
# Function to calculate sum of all array
# elements whose count of set bits are unique
def getSum(arr):
# Stores frequency of all possible
# count of set bits
mp = {}
# Stores the sum of array elements
ans = 0
# Traverse the array
for i in arr:
# Count the number of set bits
key = setBitCount(i)
mp[key] = [0, i]
# Traverse the array
for i in arr:
key = setBitCount(i)
mp[key][0] += 1
# Update the value of ans
for i in mp:
# If frequency is 1
if mp[i][0] == 1:
ans += mp[i][1]
print(ans)
# Driver Code
arr = [8, 3, 7, 5, 3]
getSum(arr)
C#
// C# program for the approach
using System;
using System.Collections.Generic;
class solution{
// Function to count the number
// of set bits in an integer N
static int setBitCount(int n)
{
// Stores the count of set bits
int ans = 0;
// Iterate until N is non-zero
while (n>0)
{
ans += n & 1;
n >>= 1;
}
// Stores the resultant count
return ans;
}
// Function to calculate sum of all array
// elements whose count of set bits are unique
static void getSum(int []arr, int n)
{
// Stores frequency of all possible
// count of set bits
Dictionary mp = new Dictionary();
// Stores the sum of array elements
int ans = 0;
// Traverse the array
for(int i = 0; i < n; i++)
{
// Count the number of set bits
int key = setBitCount(arr[i]);
if(mp.ContainsKey(key))
mp[key] += 1;
else
mp[key] = 1;
}
// Traverse the array
// And Update the value of ans
for(int i = 0; i < n; i++)
{
int key = setBitCount(arr[i]);
// If frequency is 1
if (mp[key] == 1)
ans += arr[i];
}
Console.Write(ans);
}
// Driver Code
public static void Main()
{
int []arr = {8, 3, 7, 5, 3};
int n = arr.Length;
getSum(arr, n);
}
}
// This code is contributed by ipg2016107.
输出:
15
时间复杂度: O(N)
辅助空间: O(1)