Count pairs in an array which have at least one digit common (original) (raw)

Last Updated : 08 Mar, 2023

Given an array of N numbers. Find out the number of pairs i and j such that i < j and Ai and Aj have at least one digit common (For e.g. (11, 19) have 1 digit common but (36, 48) have no digit common)

Examples:

Input: A[] = { 10, 12, 24 }
Output: 2
Explanation: Two valid pairs are (10, 12) and (12, 24) which have atleast one digit common

Method 1 (Brute Force):

A naive approach to solve this problem is just by running two nested loops and consider all possible pairs. We can check if the two numbers have at least one common digit, by extracting every digit of the first number and try to find it in the extracted digits of second number. The task would become much easier we simply convert them into strings.

Below is the implementation of the above approach:

C++ `

// CPP Program to count pairs in an array // with some common digit #include <bits/stdc++.h>

using namespace std;

// Returns true if the pair is valid, // otherwise false bool checkValidPair(int num1, int num2) { // converting integers to strings string s1 = to_string(num1); string s2 = to_string(num2);

// Iterate over the strings and check
// if a character in first string is also
// present in second string, return true
for (int i = 0; i < s1.size(); i++)
    for (int j = 0; j < s2.size(); j++)
        if (s1[i] == s2[j])
            return true;

// No common digit found
return false;

}

// Returns the number of valid pairs int countPairs(int arr[], int n) { int numberOfPairs = 0;

// Iterate over all possible pairs
for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
        if (checkValidPair(arr[i], arr[j]))
            numberOfPairs++;

return numberOfPairs;

}

// Driver Code to test above functions int main() { int arr[] = { 10, 12, 24 }; int n = sizeof(arr) / sizeof(arr[0]); cout << countPairs(arr, n) << endl; return 0; }

Java

// Java Program to count // pairs in an array // with some common digit import java.io.*;

class GFG {

// Returns true if the pair 
// is valid, otherwise false
static boolean checkValidPair(int num1, 
                              int num2)
{
    // converting integers
    // to strings
    String s1 = Integer.toString(num1);
    String s2 = Integer.toString(num2);

    // Iterate over the strings 
    // and check if a character 
    // in first string is also
    // present in second string, 
    // return true
    for (int i = 0; i < s1.length(); i++)
        for (int j = 0; j < s2.length(); j++)
            if (s1.charAt(i) == s2.charAt(j))
                return true;

    // No common 
    // digit found
    return false;
}

// Returns the number
// of valid pairs
static int countPairs(int []arr, int n)
{
    int numberOfPairs = 0;

    // Iterate over all
    // possible pairs
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (checkValidPair(arr[i], arr[j]))
                numberOfPairs++;

    return numberOfPairs;
}

// Driver Code 
public static void main(String args[])
{
    int []arr = new int[]{ 10, 12, 24 };
    int n = arr.length;
    System.out.print(countPairs(arr, n));
}

}

// This code is contributed // by manish shaw.

Python3

Python3 Program to count pairs in

an array with some common digit

Returns true if the pair is

valid, otherwise false

def checkValidPair(num1, num2) :

# converting integers to strings 
s1 = str(num1)
s2 = str(num2) 

# Iterate over the strings and check if
# a character in first string is also 
# present in second string, return true 
for i in range(len(s1)) : 
    for j in range(len(s2)) : 
        if (s1[i] == s2[j]) :
            return True; 

# No common digit found 
return False; 

Returns the number of valid pairs

def countPairs(arr, n) :

numberOfPairs = 0

# Iterate over all possible pairs 
for i in range(n) :
    for j in range(i + 1, n) :
        if (checkValidPair(arr[i], arr[j])) :
            numberOfPairs += 1

return numberOfPairs

Driver Code

if name == "main" : arr = [ 10, 12, 24 ] n = len(arr) print(countPairs(arr, n))

This code is contributed by Ryuga

C#

// C# Program to count pairs in an array // with some common digit using System;

class GFG {

// Returns true if the pair is valid,
// otherwise false
static bool checkValidPair(int num1, int num2)
{
    // converting integers to strings
    string s1 = num1.ToString();
    string s2 = num2.ToString();

    // Iterate over the strings and check
    // if a character in first string is also
    // present in second string, return true
    for (int i = 0; i < s1.Length; i++)
        for (int j = 0; j < s2.Length; j++)
            if (s1[i] == s2[j])
                return true;

    // No common digit found
    return false;
}

// Returns the number of valid pairs
static int countPairs(int []arr, int n)
{
    int numberOfPairs = 0;

    // Iterate over all possible pairs
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (checkValidPair(arr[i], arr[j]))
                numberOfPairs++;

    return numberOfPairs;
}

// Driver Code to test above functions
static void Main()
{
    int []arr = new int[]{ 10, 12, 24 };
    int n = arr.Length;
    Console.WriteLine(countPairs(arr, n));
}

}

// This code is contributed by manish shaw.

PHP

s1=(string)s1 = (string)s1=(string)num1; s2=(string)s2 = (string)s2=(string)num2; // Iterate over the strings and check // if a character in first string is also // present in second string, return true for ($i = 0; i<strlen(i < strlen(i<strlen(s1); $i++) for ($j = 0; j<strlen(j < strlen(j<strlen(s2); $j++) if ($s1[$i] == s2[s2[s2[j]) return true; // No common digit found return false; } // Returns the number of valid pairs function countPairs(&$arr, $n) { $numberOfPairs = 0; // Iterate over all possible pairs for ($i = 0; i<i < i<n; $i++) for ($j = i+1;i + 1; i+1;j < n;n; n;j++) if (checkValidPair($arr[$i], arr[arr[arr[j])) $numberOfPairs++; return $numberOfPairs; } // Driver Code $arr = array(10, 12, 24 ); n=sizeof(n = sizeof(n=sizeof(arr); echo (countPairs($arr, $n)); // This code is contributed // by Shivi_Aggarwal ?>

JavaScript

`

Time Complexity: O(N2) where N is the size of array.
Space Complexity : O( 1 )

Method 2 (Bit Masking):

An efficient approach of solving this problem is creating a bit mask for every digit present in a particular number. Thus, for every digit to be present in a number if we have a mask of 1111111111.

Digits - 0 1 2 3 4 5 6 7 8 9 | | | | | | | | | | Mask - 1 1 1 1 1 1 1 1 1 1

Here 1 denotes that the corresponding ith digit is set. For e.g. 1235 can be represented as Digits - 0 1 2 3 4 5 6 7 8 9 | | | | | | | | | | Mask for 1235 - 0 1 1 1 0 1 0 0 0 0

Now we just have to extract every digit of a number and make the corresponding bit set (1 << ith digit) and store the whole number as a mask. Careful analysis suggests that the maximum value of the mask is 1023 in decimal (which contains all the digits from 0 - 9). Since the same set of digits can exist in more than one number, we need to maintain a frequency array to store the count of mask value.

Let the frequencies of two masks i and j be freqi and freqj respectively,
If(i AND j) return true, means ith and jth mask contains atleast one common set bit which in turn implies that the numbers from which these masks have been built also contain a common digit
then,
increment the answer
ans += freqi * freqj [ if i != j ]
ans += (freqi * (freqi - 1)) / 2 [ if j == i ]

Below is the implementation of this efficient approach:

C++ `

// CPP Program to count pairs in an array with // some common digit #include <bits/stdc++.h> using namespace std;

// This function calculates the mask frequencies // for every present in the array void calculateMaskFrequencies(int arr[], int n, unordered_map<int, int>& freq) { // Iterate over the array for (int i = 0; i < n; i++) {

    int num = arr[i];

    // Creating an empty mask
    int mask = 0;

    // Extracting every digit of the number
    // and updating corresponding bit in the
    // mask
    while (num > 0) {
        mask = mask | (1 << (num % 10));
        num /= 10;
    }

    // Update the frequency array
    freq[mask]++;
}

}

// Function return the number of valid pairs int countPairs(int arr[], int n) { // Store the mask frequencies unordered_map<int, int> freq;

calculateMaskFrequencies(arr, n, freq);

long long int numberOfPairs = 0;

// Considering every possible pair of masks
// and calculate pairs according to their 
// frequencies
for (int i = 0; i < 1024; i++) {
    numberOfPairs += (freq[i] * (freq[i] - 1)) / 2;
    for (int j = i + 1; j < 1024; j++) {

        // if it contains a common digit
        if (i & j)
            numberOfPairs += (freq[i] * freq[j]);
    }
}
return numberOfPairs;

}

// Driver Code to test above functions int main() { int arr[] = { 10, 12, 24 }; int n = sizeof(arr) / sizeof(arr[0]); cout << countPairs(arr, n) << endl; return 0; }

Java

// Java Program to count pairs in an array with // some common digit import java.io.; import java.util.; class GFG {

// Store the mask frequencies public static Map<Integer, Integer> freq = new HashMap<Integer, Integer>();

// This function calculates the mask frequencies // for every present in the array public static void calculateMaskFrequencies(int[] arr,int n) {

// Iterate over the array
for(int i = 0; i < n; i++)
{
  int num = arr[i];

  // Creating an empty mask
  int mask = 0;

  // Extracting every digit of the number
  // and updating corresponding bit in the
  // mask
  while(num > 0)
  {
    mask = mask | (1 << (num % 10));
    num /= 10;
  }

  // Update the frequency array
  if(freq.containsKey(mask))
  {
    freq.put(new Integer(mask), freq.get(mask) + 1);
  }
  else
  {
    freq.put(new Integer(mask), 1);
  }
}

}

// Function return the number of valid pairs public static int countPairs(int[] arr, int n) { calculateMaskFrequencies(arr, n); int numberOfPairs = 0;

// Considering every possible pair of masks
// and calculate pairs according to their 
// frequencies
for(int i = 0; i < 1024; i++)
{
  int x = 0;
  if(freq.containsKey(i))
  {
    x = freq.get(i);

  }
  numberOfPairs += ((x) * (x - 1)) / 2;
  for(int j = i + 1; j < 1024; j++)
  {
    int y = 0;

    // if it contains a common digit
    if((i & j) != 0)
    {
      if(freq.containsKey(j))
      {
        y = freq.get(j);
      }
      numberOfPairs += x * y;
    }
  }
}
return numberOfPairs;

}

// Driver Code public static void main (String[] args) { int[] arr = {10, 12, 24}; int n = arr.length;
System.out.println(countPairs(arr, n)); } }

// This code is contributed by avanitrachhadiya2155

Python3

Python3 Program to count pairs in an array

with some common digit

This function calculates the mask frequencies

for every present in the array

def calculateMaskFrequencies(arr, n, freq):

# Iterate over the array
for i in range(n):

    num = arr[i]

    # Creating an empty mask
    mask = 0

    # Extracting every digit of the number
    # and updating corresponding bit in the
    # mask
    while (num > 0):
        mask = mask | (1 << (num % 10))
        num //= 10
    
    # Update the frequency array
    freq[mask] = freq.get(mask, 0) + 1

Function return the number of valid pairs

def countPairs(arr, n):

# Store the mask frequencies
freq = dict()

calculateMaskFrequencies(arr, n, freq)

numberOfPairs = 0

# Considering every possible pair of masks
# and calculate pairs according to their 
# frequencies
for i in range(1024):

    x = 0

    if i in freq.keys():
        x = freq[i]

    numberOfPairs += (x * (x - 1)) // 2

    for j in range(i + 1, 1024):

        y = 0

        if j in freq.keys():
            y = freq[j] 
            
        # if it contains a common digit
        if (i & j):
            numberOfPairs += (x * y)
    
return numberOfPairs

Driver Code

arr = [10, 12, 24] n = len(arr) print(countPairs(arr, n))

This code is contributed by mohit kumar

C#

// C# Program to count pairs in an array with // some common digit using System; using System.Collections.Generic;

public class GFG {

// Store the mask frequencies
static Dictionary<int, int> freq =  new Dictionary<int, int>(); 

// This function calculates the mask frequencies
// for every present in the array
public static void calculateMaskFrequencies(int[] arr,int n)
{
  
    // Iterate over the array
    for(int i = 0; i < n; i++)
    {
        int num = arr[i];

        // Creating an empty mask
        int mask = 0;

        // Extracting every digit of the number
        // and updating corresponding bit in the
        // mask
        while(num > 0)
        {
            mask = mask | (1 << (num % 10));
            num /= 10;
        }

        // Update the frequency array
        if(freq.ContainsKey(mask))
        {
            freq[mask]++;
        }
        else
        {
            freq.Add(mask, 1);
        }
    }
    
}
public static int countPairs(int[] arr, int n)
{
    calculateMaskFrequencies(arr, n);
    int numberOfPairs = 0;

    // Considering every possible pair of masks
    // and calculate pairs according to their 
    // frequencies
    for(int i = 0; i < 1024; i++)
    {
        int x = 0;
        if(freq.ContainsKey(i))
        {
            x = freq[i];

        }
        numberOfPairs += ((x) * (x - 1)) / 2;
        for(int j = i + 1; j < 1024; j++)
        {
            int y = 0;

            // if it contains a common digit
            if((i & j) != 0)
            {   
                if(freq.ContainsKey(j))
                {
                    y = freq[j];
                }
                numberOfPairs += x * y;
            }
        }
    }
    return numberOfPairs;
    
}

// Driver Code 
static public void Main ()
{
    int[] arr = {10, 12, 24};
    int n = arr.Length;        
    Console.WriteLine(countPairs(arr, n));
}

}

// This code is contributed by rag2127

JavaScript

`

Time Complexity: O(N + 1024 * 1024), where N is the size of the array.

Space Complexity : O( 1 )