Open In App

Sum of array elements whose count of set bits are unique

Last Updated : 29 Mar, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

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:

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)
Space Complexity: O(N) as we are using a map to store the count of the distinct bits.


Next Article

Similar Reads