📜  设置位数相同的数组中的对数

📅  最后修改于: 2021-04-29 03:44:02             🧑  作者: Mango

给定一个包含N个整数的数组arr ,任务是计算具有相同设置位数目的元素对的可能数目。

例子:

方法:

  • 将所有数字的设置位预计算并存储到bitscount []中,直到数组的最大元素。对于所有2的幂,将1存储在其相应的索引处。之后,通过以下关系计算其余元素的设置位数:
  • 将设置位的频率存储在映射的数组元素中。
  • 为每个设置的位计数添加可能的对数。如果X个元素的置位位数相同,则它们之间可能的对数为X *(X – 1)/ 2
  • 打印此类对的总数。

下面的代码是上述方法的实现:

C++14
// C++ Program to count
// possible number of pairs
// of elements with same
// number of set bits.
 
#include 
using namespace std;
 
// Function to return the
// count of Pairs
int countPairs(int arr[], int N)
{
    // Get the maximum element
    int maxm = *max_element(arr, arr + N);
 
    int i, k;
    // Array to store count of bits
    // of all elements upto maxm
    int bitscount[maxm + 1] = { 0 };
 
    // Store the set bits
    // for powers of 2
    for (i = 1; i <= maxm; i *= 2)
        bitscount[i] = 1;
    // Compute the set bits for
    // the remaining elements
    for (i = 1; i <= maxm; i++) {
        if (bitscount[i] == 1)
            k = i;
        if (bitscount[i] == 0) {
            bitscount[i]
                = bitscount[k]
                  + bitscount[i - k];
        }
    }
 
    // Store the frequency
    // of respective counts
    // of set bits
    map setbits;
    for (int i = 0; i < N; i++) {
        setbits[bitscount[arr[i]]]++;
    }
 
    int ans = 0;
    for (auto it : setbits) {
        ans += it.second
               * (it.second - 1) / 2;
    }
 
    return ans;
}
 
int main()
{
    int N = 12;
    int arr[] = { 1, 2, 3, 4, 5, 6, 7,
                  8, 9, 10, 11, 12 };
 
    cout << countPairs(arr, N);
 
    return 0;
}


Java
// Java program to count possible
// number of pairs of elements
// with same number of set bits
import java.util.*;
import java.lang.*;
 
class GFG{
     
// Function to return the
// count of Pairs
static int countPairs(int []arr, int N)
{
     
    // Get the maximum element
    int maxm = arr[0];
       
    for(int j = 1; j < N; j++)
    {
        if (maxm < arr[j])
        {
            maxm = arr[j];
        }
    }
   
    int i, k = 0;
       
    // Array to store count of bits
    // of all elements upto maxm
    int[] bitscount = new int[maxm + 1];
    Arrays.fill(bitscount, 0);
   
    // Store the set bits
    // for powers of 2
    for(i = 1; i <= maxm; i *= 2)
        bitscount[i] = 1;
           
    // Compute the set bits for
    // the remaining elements
    for(i = 1; i <= maxm; i++)
    {
        if (bitscount[i] == 1)
            k = i;
        if (bitscount[i] == 0)
        {
            bitscount[i] = bitscount[k] + 
                           bitscount[i - k];
        }
    }
   
    // Store the frequency
    // of respective counts
    // of set bits
    Map setbits = new HashMap<>();
       
    for(int j = 0; j < N; j++) 
    {
        setbits.put(bitscount[arr[j]],
        setbits.getOrDefault(
            bitscount[arr[j]], 0) + 1);
    }
   
    int ans = 0;
   
    for(int it : setbits.values())
    {
        ans += it * (it - 1) / 2;
       
    }
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    int N = 12;
    int []arr = { 1, 2, 3, 4, 5, 6, 7,
                  8, 9, 10, 11, 12 };
     
    System.out.println(countPairs(arr, N));
}
}
 
// This code is contributed by offbeat


Python3
# Python3 program to count possible number
# of pairs of elements with same number
# of set bits.
  
# Function to return the
# count of Pairs
def countPairs(arr, N):
     
    # Get the maximum element
    maxm = max(arr)
    i = 0
    k = 0
     
    # Array to store count of bits
    # of all elements upto maxm
    bitscount = [0 for i in range(maxm + 1)]
     
    i = 1
     
    # Store the set bits
    # for powers of 2
    while i <= maxm:
        bitscount[i] = 1
        i *= 2
         
    # Compute the set bits for
    # the remaining elements
    for i in range(1, maxm + 1):
        if (bitscount[i] == 1):
            k = i
        if (bitscount[i] == 0):
            bitscount[i] = (bitscount[k] +
                            bitscount[i - k])
  
    # Store the frequency
    # of respective counts
    # of set bits
    setbits = dict()
     
    for i in range(N):
        if bitscount[arr[i]] in setbits:
            setbits[bitscount[arr[i]]] += 1
        else:
            setbits[bitscount[arr[i]]] = 1
  
    ans = 0
     
    for it in setbits.values():
        ans += it * (it - 1) // 2
  
    return ans
  
# Driver Code
if __name__=='__main__':
     
    N = 12
    arr = [ 1, 2, 3, 4, 5, 6, 7,
            8, 9, 10, 11, 12 ]
  
    print(countPairs(arr, N))
  
# This code is contributed by pratham76


C#
// C# program to count
// possible number of pairs
// of elements with same
// number of set bits.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
 
class GFG{
     
// Function to return the
// count of Pairs
static int countPairs(int []arr, int N)
{
     
    // Get the maximum element
    int maxm = -int.MaxValue;
     
    for(int j = 0; j < N; j++)
    {
        if (maxm < arr[j])
        {
            maxm = arr[j];
        }
    }
 
    int i, k = 0;
     
    // Array to store count of bits
    // of all elements upto maxm
    int []bitscount = new int[maxm + 1];
    Array.Fill(bitscount, 0);
 
    // Store the set bits
    // for powers of 2
    for(i = 1; i <= maxm; i *= 2)
        bitscount[i] = 1;
         
    // Compute the set bits for
    // the remaining elements
    for(i = 1; i <= maxm; i++)
    {
        if (bitscount[i] == 1)
            k = i;
        if (bitscount[i] == 0)
        {
            bitscount[i] = bitscount[k] +
                           bitscount[i - k];
        }
    }
 
    // Store the frequency
    // of respective counts
    // of set bits
    Dictionary setbits = new Dictionary();
     
    for(int j = 0; j < N; j++)
    {
        if (setbits.ContainsKey(bitscount[arr[j]]))
        {
            setbits[bitscount[arr[j]]]++;
        }
        else
        {
            setbits[bitscount[arr[j]]] = 1;
        }
    }
 
    int ans = 0;
 
    foreach(KeyValuePair it in setbits)
    {
        ans += it.Value * (it.Value - 1) / 2;
    }
    return ans;
}
     
// Driver Code
public static void Main(string[] args)
{
    int N = 12;
    int []arr = { 1, 2, 3, 4, 5, 6, 7,
                  8, 9, 10, 11, 12 };
 
    Console.Write(countPairs(arr, N));
}
}
 
// This code is contributed by rutvik_56


输出:
22