# Print all numbers less than N with at-most 2 unique digits

Given a number N(less than 10^9). The task is to print all the numbers less than N which are having a maximum of 2 unique digits.

Note: Number such as 100, 111, 101 are valid as the number of unique digits are at most 2 but 123 is invalid as it has 3 unique digits.

Examples:

Input: N = 12
Output: The numbers are: 1 2 3 4 5 6 7 8 9 10 11

Input: N = 154
Output: The numbers are: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 110 111 112 113 114 115 116 117 118 119 121 122 131 133 141 144 151

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach:

• Since we are said a maximum of two unique digits, two loops will give us all combination of two digits.
• A recursive function is written in terms to generate all the numbers using two digits.
• Call the function with num initially as 0, and generate numbers using recurrence num*10+a and num*10+b, with the base case being num>=n.
• A set can be used to store all the numbers as there can be duplicate elements which the recursion function generates.

Below is the implementation of the above approach:

## C++

 `// C++ program to print all the numbers ` `// less than N which have at most 2 unique digits ` `#include ` `using` `namespace` `std; ` ` `  `set<``int``> st; ` ` `  `// Function to generate all possible numbers ` `void` `generateNumbers(``int` `n, ``int` `num, ``int` `a, ``int` `b) ` `{ ` `    ``// If the number is less than n ` `    ``if` `(num > 0 && num < n) ` `        ``st.insert(num); ` ` `  `    ``// If the number exceeds ` `    ``if` `(num >= n) ` `        ``return``; ` ` `  `    ``// Check if it is not the same number ` `    ``if` `(num * 10 + a > num) ` `        ``generateNumbers(n, num * 10 + a, a, b); ` ` `  `    ``generateNumbers(n, num * 10 + b, a, b); ` `} ` ` `  `// Function to print all numbers ` `void` `printNumbers(``int` `n) ` `{ ` `    ``// All combination of digits ` `    ``for` `(``int` `i = 0; i <= 9; i++) ` `        ``for` `(``int` `j = i + 1; j <= 9; j++) ` `            ``generateNumbers(n, 0, i, j); ` ` `  `    ``cout << ``"The numbers are: "``; ` ` `  `    ``// Print all numbers ` `    ``while` `(!st.empty()) { ` `        ``cout << *st.begin() << ``" "``; ` `        ``st.erase(st.begin()); ` `    ``} ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `n = 12; ` ` `  `    ``printNumbers(n); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to print all the numbers  ` `// less than N which have at most 2 unique digits  ` `import` `java.util.*; ` `class` `Solution{ ` `   `  `static` `Set st= ``new` `HashSet();  ` `   `  `// Function to generate all possible numbers  ` `static` `void` `generateNumbers(``int` `n, ``int` `num, ``int` `a, ``int` `b)  ` `{  ` `    ``// If the number is less than n  ` `    ``if` `(num > ``0` `&& num < n)  ` `        ``st.add(num);  ` `   `  `    ``// If the number exceeds  ` `    ``if` `(num >= n)  ` `        ``return``;  ` `   `  `    ``// Check if it is not the same number  ` `    ``if` `(num * ``10` `+ a > num)  ` `        ``generateNumbers(n, num * ``10` `+ a, a, b);  ` `   `  `    ``generateNumbers(n, num * ``10` `+ b, a, b);  ` `}  ` `   `  `// Function to print all numbers  ` `static` `void` `printNumbers(``int` `n)  ` `{  ` `    ``// All combination of digits  ` `    ``for` `(``int` `i = ``0``; i <= ``9``; i++)  ` `        ``for` `(``int` `j = i + ``1``; j <= ``9``; j++)  ` `            ``generateNumbers(n, ``0``, i, j);  ` `   `  `    ``System.out.print( ``"The numbers are: "``);  ` `   `  `    ``// Print all numbers  ` `    ``System.out.print(st); ` `     `  `    ``st.clear(); ` `}  ` `   `  `// Driver code  ` `public` `static` `void` `main(String args[])  ` `{  ` `    ``int` `n = ``12``;  ` `   `  `    ``printNumbers(n);  ` `   `  `}  ` `} ` `// This code is contributed by Arnab Kundu `

## Python3

# Python 3 program to print all the
# numbers less than N which have at
# most 2 unique digits
st = set()

# Function to generate all possible numbers
def generateNumbers(n, num, a, b):

# If the number is less than n
if (num > 0 and num < n): st.add(num) # If the number exceeds if (num >= n):
return

# Check if it is not the same number
if (num * 10 + a > num):
generateNumbers(n, num * 10 + a, a, b)

generateNumbers(n, num * 10 + b, a, b)

# Function to print all numbers
def printNumbers(n):

# All combination of digits
for i in range(10):
for j in range(i + 1, 10, 1):
generateNumbers(n, 0, i, j)

print(“The numbers are:”, end = ” “)

# Print all numbers
l = list(st)
for i in l:
print(i, end = ” “)

# Driver code
if __name__ == ‘__main__’:
n = 12

printNumbers(n)

# This code is contributed by
# Shashank_Sharma

Output:

```The numbers are: 1 2 3 4 5 6 7 8 9 10 11
```

Time complexity: O(36* 230)

My Personal Notes arrow_drop_up