Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Sum of array elements whose count of set bits are unique

  • Last Updated : 14 Sep, 2021

Given an array arr[] consisting of N positive integers, the task is to find the sum of all array elements having a distinct count of set bits in the array.

Examples:

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Input: arr[] = {8, 3, 7, 5, 3}
Output: 15
Explanation:
The count of set bits in each array of elements is: 



  1. arr[0] = 8 = (1000)2, has 1 set bits.
  2. arr[1] = 3 = (11)2, has 2 set bits.
  3. arr[2] = 7 = (111)2, has 3 set bits.
  4. arr[3] = 5 = (101)2, has 2 set bits.
  5. 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, the required sum = 8 + 7 = 15.

Input: arr[] = {4, 5, 3, 5, 3, 2}
Output:

Approach: The idea is to store the element with the corresponding count of set bits on a map, then find the sum of elements having a unique count of set bits. Follow the steps below to solve the problem:

  • Initialize a variable, say sum to store the resultant sum of elements, and a Map, say M that stores the elements having a particular count of set bits.
  • Traverse the array arr[] and store the element arr[i] according to the set bit count in a Map M.
  • Now, traverse the map and if the frequency of any set bit count is 1, then add the corresponding value associated with it in the variable sum.
  • After completing the above steps, print the value of the sum as the result.

Below is the implementation of the above approach:

C++




// C++ program for the approach
#include <iostream>
#include <bits/stdc++.h>
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<int, int> 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<Integer,Integer> mp = new HashMap<Integer,Integer>();
 
    // 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<int, int> mp = new Dictionary<int,int>();
     
    // 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.

Javascript




<script>
 
// JavaScript program for the above approach
 
// Function to count the number
  // of set bits in an integer N
  function setBitCount(n)
  {
  
    // Stores the count of set bits
    let 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
  function getSum(arr, n)
  {
  
    // Stores frequency of all possible
    // count of set bits
    let mp = new Map();
  
    // Stores the sum of array elements
    let ans = 0;
  
    // Traverse the array
    for(let i = 0; i < n; i++)
    {
  
      // Count the number of set bits
      let key = setBitCount(arr[i]);
      if(mp.has(key))
        mp.set(key,mp.get(key) + 1);
      else
        mp.set(key, 1);
  
    }
  
    // Traverse the array
    // And Update the value of ans
    for(let i = 0; i < n; i++)
    {
      let key = setBitCount(arr[i]);
  
      // If frequency is 1
      if (mp.has(key) && mp.get(key) == 1)
        ans += arr[i];
    }
    document.write(ans);
  }
 
// Driver Code
 
    let arr = [8, 3, 7, 5, 3];
    let n = arr.length;
  
    getSum(arr, n);
   
</script>        
Output: 
15

 

Time Complexity: O(N)
Auxiliary Space: O(1)




My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!