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++
#include <bits/stdc++.h>
using namespace std;
vector< int > find3DigitNumbers(vector< int >&
digits)
{
vector< int > count(10, 0);
for ( auto & d : digits)
count[d]++;
vector< int > res;
for ( int num = 100; num < 999; num++) {
vector< int > currCount(10, 0);
int temp = num;
while (temp) {
currCount[temp % 10]++;
temp /= 10;
}
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;
}
void printAnswer(vector< int >& v1)
{
for ( int i = 0; i < v1.size(); i++) {
cout << v1[i] << " " ;
}
cout << endl;
}
int main()
{
vector< int > v1 = { 2, 1, 3, 0 };
vector< int > ans = find3DigitNumbers(v1);
printAnswer(ans);
return 0;
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
static void find3DigitNumbers( int digits[], List<Integer> res)
{
int count[] = new int [ 10 ];;
for ( int i = 0 ; i < digits.length; i++)
count[digits[i]]++;
for ( int num = 100 ; num < 999 ; num++) {
int currCount[] = new int [ 10 ];
int temp = num;
while (temp > 0 ) {
currCount[temp % 10 ]++;
temp /= 10 ;
}
Boolean flag = true ;
for ( int i = 0 ; i < 10 ; i++) {
if (currCount[i] > count[i]) {
flag = false ;
break ;
}
}
if (flag == true ) {
res.add(num);
}
}
}
static void printAnswer(List<Integer> res)
{
for ( int i = 0 ; i < res.size(); i++)
System.out.print(res.get(i) + " " );
}
public static void main (String[] args)
{
int arr[] = { 2 , 1 , 3 , 0 };
List<Integer> ans= new ArrayList<Integer>();
find3DigitNumbers(arr, ans);
printAnswer(ans);
}
}
|
Python3
def find3DigitNumbers(digits):
count = [ 0 ] * 10
for d in digits:
count[d] + = 1
res = []
for num in range ( 100 , 999 ):
currCount = [ 0 ] * 10
temp = num
while (temp):
currCount[temp % 10 ] + = 1
temp = temp / / 10
flag = True
for i in range ( 10 ):
if (currCount[i] > count[i]):
flag = False
break
if (flag):
res.append(num)
return res
def printAnswer(v1):
for i in range ( len (v1)):
print (v1[i], end = " " )
print ('')
v1 = [ 2 , 1 , 3 , 0 ]
ans = find3DigitNumbers(v1)
printAnswer(ans)
|
C#
using System;
using System.Collections;
class GFG {
static void find3DigitNumbers( int []digits, ArrayList res)
{
int []count = new int [10];;
for ( int i = 0; i < digits.Length; i++)
count[digits[i]]++;
for ( int num = 100; num < 999; num++) {
int []currCount = new int [10];
int temp = num;
while (temp > 0) {
currCount[temp % 10]++;
temp /= 10;
}
bool flag = true ;
for ( int i = 0; i < 10; i++) {
if (currCount[i] > count[i]) {
flag = false ;
break ;
}
}
if (flag == true ) {
res.Add(num);
}
}
}
static void printAnswer(ArrayList res)
{
for ( int i = 0; i < res.Count; i++)
Console.Write(res[i] + " " );
}
public static void Main ()
{
int []arr = { 2, 1, 3, 0 };
ArrayList ans= new ArrayList();
find3DigitNumbers(arr, ans);
printAnswer(ans);
}
}
|
Javascript
<script>
function find3DigitNumbers(
digits) {
let count = new Array(10).fill(0);
for (let d of digits)
count[d]++;
let res = [];
for (let num = 100; num < 999; num++) {
let currCount = new Array(10).fill(0);
let temp = num;
while (temp) {
currCount[temp % 10]++;
temp = Math.floor(temp / 10);
}
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 printAnswer(v1) {
for (let i = 0; i < v1.length; i++) {
document.write(v1[i] + " " );
}
document.write( '<br>' )
}
let v1 = [2, 1, 3, 0];
let ans = find3DigitNumbers(v1);
printAnswer(ans);
</script>
|
Output102 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)