Open In App

Find all distinct three digit numbers from given array of digits

Last Updated : 10 Aug, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report

Given an array containing digits[], where each element is a single digit integer. The array may contain duplicates. The task is to find all the unique integers that follow the given requirements:

  • The integer consists of the concatenation of three elements from digits in any arbitrary order.
  • The integer does not have leading zeros.

Examples:

Input: digits[] = {2, 1, 3, 0}
Output: {102, 103, 120, 123, 130, 132, 201, 203, 210, 213, 230, 231, 301, 302, 310, 312, 320, 321}
Explanation: The above are the three digit numbers formed.  

Input: digits[] = {3, 7, 5}
Output: [357, 375, 537, 573, 735, 753 ]

 

Approach: This problem can be solved by using Frequency Map. Find count of all elements in given digits array. Follow the steps below to solve the given problem.

  • Check for all numbers between 100 to 999 whether they can be formed by the digits present in the digits vector.
  • Use 2 maps for the same. If the number can be made, then add it to the answer.
  • In the end, return the answer.

Below is the implementation of the above approach:

C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;

// Function to find all the unique
// 3 digit number that can be formed
// from the given digits
vector<int> find3DigitNumbers(vector<int>&
                                  digits)
{
    // Generating frequency map
    // of the given digits
    vector<int> count(10, 0);
    for (auto& d : digits)
        count[d]++;

    vector<int> res;

    for (int num = 100; num < 999; num++) {

        // Generating frequency map
        // of the current number
        vector<int> currCount(10, 0);
        int temp = num;

        while (temp) {
            currCount[temp % 10]++;
            temp /= 10;
        }

        // Checking if the number
        // can be generated or not
        bool flag = true;

        for (int i = 0; i < 10; i++) {
            if (currCount[i] > count[i]) {
                flag = false;
                break;
            }
        }

        if (flag) {
            res.push_back(num);
        }
    }
    return res;
}

// Function to print answer
void printAnswer(vector<int>& v1)
{
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i] << " ";
    }
    cout << endl;
}

// Driver code
int main()
{
    vector<int> v1 = { 2, 1, 3, 0 };

    // Function Call
    vector<int> ans = find3DigitNumbers(v1);

    // Printing answer
    printAnswer(ans);
    return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;

class GFG {

  // Function to find all the unique
  // 3 digit number that can be formed
  // from the given digits
  static void find3DigitNumbers(int digits[], List<Integer> res)
  {
    // Generating frequency map
    // of the given digits
    int count[] = new int[10];;
    for (int i = 0; i < digits.length; i++)
      count[digits[i]]++;

    for (int num = 100; num < 999; num++) {

      // Generating frequency map
      // of the current number
      int currCount[] = new int[10];
      int temp = num;

      while (temp > 0) {
        currCount[temp % 10]++;
        temp /= 10;
      }

      // Checking if the number
      // can be generated or not
      Boolean flag = true;

      for (int i = 0; i < 10; i++) {
        if (currCount[i] > count[i]) {
          flag = false;
          break;
        }
      }

      if (flag == true) {
        res.add(num);
      }
    }
  }

  // Function to print answer
  static void printAnswer(List<Integer> res)
  {
    for(int i = 0;  i < res.size(); i++)
      System.out.print(res.get(i) + " ");
  }

  // Driver code
  public static void main (String[] args) 
  {

    int arr[] = { 2, 1, 3, 0 };

    List<Integer> ans=new ArrayList<Integer>(); 
    // Function Call
    find3DigitNumbers(arr, ans);

    // Printing answer
    printAnswer(ans);
  }
}

// This code is contributed by hrithikgarg03188.
Python3
# Python code for the above approach

# Function to find all the unique
# 3 digit number that can be formed
# from the given digits
def find3DigitNumbers(digits):
  
    # Generating frequency map
    # of the given digits
    count = [0] * 10
    for d in digits:
        count[d] += 1

    res = []

    for num in range(100, 999):

        # Generating frequency map
        # of the current number
        currCount = [0] * 10
        temp = num

        while (temp):
            currCount[temp % 10] += 1
            temp = temp // 10

        # Checking if the number
        # can be generated or not
        flag = True

        for i in range(10):
            if (currCount[i] > count[i]):
                flag = False
                break

        if (flag):
            res.append(num)

    return res

# Function to print answer
def printAnswer(v1):
    for i in range(len(v1)):
        print(v1[i], end=" ")

    print('')

# Driver code
v1 = [2, 1, 3, 0]

# Function Call
ans = find3DigitNumbers(v1)

# Printing answer
printAnswer(ans)


# This code is contributed by Saurabh Jaiswal
C#
// C# program for the above approach
using System;
using System.Collections;
class GFG {

  // Function to find all the unique
  // 3 digit number that can be formed
  // from the given digits
  static void find3DigitNumbers(int []digits, ArrayList res)
  {
    // Generating frequency map
    // of the given digits
    int []count = new int[10];;
    for (int i = 0; i < digits.Length; i++)
      count[digits[i]]++;

    for (int num = 100; num < 999; num++) {

      // Generating frequency map
      // of the current number
      int []currCount = new int[10];
      int temp = num;

      while (temp > 0) {
        currCount[temp % 10]++;
        temp /= 10;
      }

      // Checking if the number
      // can be generated or not
      bool flag = true;

      for (int i = 0; i < 10; i++) {
        if (currCount[i] > count[i]) {
          flag = false;
          break;
        }
      }

      if (flag == true) {
        res.Add(num);
      }
    }
  }

  // Function to print answer
  static void printAnswer(ArrayList res)
  {
    for(int i = 0;  i < res.Count; i++)
      Console.Write(res[i] + " ");
  }

  // Driver code
  public static void Main () 
  {

    int []arr = { 2, 1, 3, 0 };

    ArrayList ans=new ArrayList(); 
    // Function Call
    find3DigitNumbers(arr, ans);

    // Printing answer
    printAnswer(ans);
  }
}

// This code is contributed by Samim Hossain Mondal.
JavaScript
 <script>
        // JavaScript code for the above approach 

        // Function to find all the unique
        // 3 digit number that can be formed
        // from the given digits
        function find3DigitNumbers(
            digits) {
            // Generating frequency map
            // of the given digits
            let count = new Array(10).fill(0);
            for (let d of digits)
                count[d]++;

            let res = [];

            for (let num = 100; num < 999; num++) {

                // Generating frequency map
                // of the current number
                let currCount = new Array(10).fill(0);
                let temp = num;

                while (temp) {
                    currCount[temp % 10]++;
                    temp = Math.floor(temp / 10);
                }

                // Checking if the number
                // can be generated or not
                let flag = true;

                for (let i = 0; i < 10; i++) {
                    if (currCount[i] > count[i]) {
                        flag = false;
                        break;
                    }
                }

                if (flag) {
                    res.push(num);
                }
            }
            return res;
        }

        // Function to print answer
        function printAnswer(v1) {
            for (let i = 0; i < v1.length; i++) {
                document.write(v1[i] + " ");
            }
            document.write('<br>')
        }

        // Driver code

        let v1 = [2, 1, 3, 0];

        // Function Call
        let ans = find3DigitNumbers(v1);

        // Printing answer
        printAnswer(ans);


       // This code is contributed by Potta Lokesh
    </script>

Output
102 103 120 123 130 132 201 203 210 213 230 231 301 302 310 312 320 321 

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


 


Next Article

Similar Reads