# Nth positive number whose absolute difference of adjacent digits is at most 1

• Last Updated : 16 Nov, 2021

Given a number N, the task is to find the Nth number which has an absolute difference of 1 between every pair of its adjacent digits.
Examples:

Input : N = 5
Output :
Explanation:
The first 5 such numbers are 1,2,3,4 and 5.
Input : N = 15
Output : 23
Explanation:
The first 15 such numbers are 1,2,3,4,5,6,7,8,9,10,11,12,21,22 and 23

Approach: In order to solve this problem we are using the Queue data structure.

• Prepare an empty Queue, and Enqueue all integers 1 to 9 in increasing order.

• Now perform the following operation N times.
• Dequeue and store in array arr which stores ith number of required type in arr[i].
• If (arr[i] % 10 != 0), then enqueue 10 * arr[i] + (arr[i] % 10) – 1.
• Enqueue 10 * arr[i] + (arr[i] % 10).
• If (arr[i] % 10 != 9), then enqueue 10 * arr[i] + (arr[i] % 10) + 1.
• Return arr[N] as the answer.

Below is the implementation of the given approach:

## C++

 `// C++ Program to find Nth number with``// absolute difference between all``// adjacent digits at most 1.` `#include ``using` `namespace` `std;`  `// Return Nth number with``// absolute difference between all``// adjacent digits at most 1.``void` `findNthNumber(``int` `N)``{``    ``// To store all such numbers``    ``long` `long` `arr[N + 1];``    ` `    ``queue<``long` `long``> q;` `    ``// Enqueue all integers from 1 to 9``    ``// in increasing order.``    ``for` `(``int` `i = 1; i <= 9; i++)``        ``q.push(i);` `    ``// Perform the operation N times so that``    ``// we can get all such N numbers.``    ``for` `(``int` `i = 1; i <= N; i++) {` `        ``// Store the front element of queue,``        ``// in array and pop it from queue.``        ``arr[i] = q.front();``        ``q.pop();` `        ``// If the last digit of dequeued integer is``        ``// not 0, then enqueue the next such number.``        ``if` `(arr[i] % 10 != 0)``            ``q.push(arr[i] * 10 + arr[i] % 10 - 1);` `        ``// Enqueue the next such number``        ``q.push(arr[i] * 10 + arr[i] % 10);` `        ``// If the last digit of dequeued integer is``        ``// not 9, then enqueue the next such number.``        ``if` `(arr[i] % 10 != 9)``            ``q.push(arr[i] * 10 + arr[i] % 10 + 1);``    ``}``    ` `    ``cout<

## Java

 `// Java program to find Nth number with``// absolute difference between all``// adjacent digits at most 1.``import` `java.util.*;` `class` `GFG{` `// Return Nth number with``// absolute difference between all``// adjacent digits at most 1.``static` `void` `findNthNumber(``int` `N)``{``    ` `    ``// To store all such numbers``    ``int` `[]arr = ``new` `int``[N + ``1``];``    ` `    ``Queue q = ``new` `LinkedList<>();` `    ``// Enqueue all integers from 1 to 9``    ``// in increasing order.``    ``for``(``int` `i = ``1``; i <= ``9``; i++)``       ``q.add(i);` `    ``// Perform the operation N times so``    ``// that we can get all such N numbers.``    ``for``(``int` `i = ``1``; i <= N; i++)``    ``{``       ` `       ``// Store the front element of queue,``       ``// in array and pop it from queue.``       ``arr[i] = q.peek();``       ``q.remove();``       ` `       ``// If the last digit of dequeued``       ``// integer is not 0, then enqueue``       ``// the next such number.``       ``if` `(arr[i] % ``10` `!= ``0``)``           ``q.add(arr[i] * ``10` `+ arr[i] % ``10` `- ``1``);``       ` `       ``// Enqueue the next such number``       ``q.add(arr[i] * ``10` `+ arr[i] % ``10``);``       ` `       ``// If the last digit of dequeued``       ``// integer is not 9, then enqueue``       ``// the next such number.``       ``if` `(arr[i] % ``10` `!= ``9``)``           ``q.add(arr[i] * ``10` `+ arr[i] % ``10` `+ ``1``);``    ``}``    ``System.out.println(arr[N]);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int` `N = ``21``;``    ` `    ``findNthNumber(N);``}``}` `// This code is contributed by Amit Katiyar`

## Python3

 `# Python 3 Program to find Nth number with``# absolute difference between all``# adjacent digits at most 1.` `# Return Nth number with``# absolute difference between all``# adjacent digits at most 1.``def` `findNthNumber(N):``    ` `    ``# To store all such numbers``    ``arr ``=` `[``0` `for` `i ``in` `range``(N ``+` `1``)]``    ` `    ``q ``=` `[]` `    ``# Enqueue all integers from 1 to 9``    ``# in increasing order.``    ``for` `i ``in` `range``(``1``, ``10``, ``1``):``        ``q.append(i)` `    ``# Perform the operation N times so that``    ``# we can get all such N numbers.``    ``for` `i ``in` `range``(``1``, N``+``1``, ``1``):``        ` `        ``# Store the front element of queue,``        ``# in array and pop it from queue.``        ``arr[i] ``=` `q[``0``]``        ``q.remove(q[``0``])` `        ``# If the last digit of dequeued integer is``        ``# not 0, then enqueue the next such number.``        ``if` `(arr[i] ``%` `10` `!``=` `0``):``            ``q.append(arr[i] ``*` `10` `+` `arr[i] ``%` `10` `-` `1``)` `        ``# Enqueue the next such number``        ``q.append(arr[i] ``*` `10` `+` `arr[i] ``%` `10``)` `        ``# If the last digit of dequeued integer is``        ``# not 9, then enqueue the next such number.``        ``if` `(arr[i] ``%` `10` `!``=` `9``):``            ``q.append(arr[i] ``*` `10` `+` `arr[i] ``%` `10` `+` `1``)``    ` `    ``print``(arr[N])` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``N ``=` `21``    ``findNthNumber(N)` `# This code is contributed by Samarth`

## C#

 `// C# program to find Nth number with``// absolute difference between all``// adjacent digits at most 1.``using` `System;``using` `System.Collections.Generic;` `class` `GFG{` `// Return Nth number with``// absolute difference between all``// adjacent digits at most 1.``static` `void` `findNthNumber(``int` `N)``{``    ` `    ``// To store all such numbers``    ``int` `[]arr = ``new` `int``[N + 1];``    ` `    ``Queue<``int``> q = ``new` `Queue<``int``>();` `    ``// Enqueue all integers from 1 to 9``    ``// in increasing order.``    ``for``(``int` `i = 1; i <= 9; i++)``       ``q.Enqueue(i);` `    ``// Perform the operation N times so``    ``// that we can get all such N numbers.``    ``for``(``int` `i = 1; i <= N; i++)``    ``{``       ` `       ``// Store the front element of queue,``       ``// in array and pop it from queue.``       ``arr[i] = q.Peek();``       ``q.Dequeue();``       ` `       ``// If the last digit of dequeued``       ``// integer is not 0, then enqueue``       ``// the next such number.``       ``if` `(arr[i] % 10 != 0)``           ``q.Enqueue(arr[i] * 10 +``                     ``arr[i] % 10 - 1);``       ` `       ``// Enqueue the next such number``       ``q.Enqueue(arr[i] * 10 + arr[i] % 10);``       ` `       ``// If the last digit of dequeued``       ``// integer is not 9, then enqueue``       ``// the next such number.``       ``if` `(arr[i] % 10 != 9)``           ``q.Enqueue(arr[i] * 10 +``                     ``arr[i] % 10 + 1);``    ``}``    ``Console.WriteLine(arr[N]);``}` `// Driver Code``public` `static` `void` `Main(String[] args)``{``    ``int` `N = 21;``    ` `    ``findNthNumber(N);``}``}` `// This code is contributed by Rohit_ranjan`

## Javascript

 ``
Output:
`45`

Time Complexity: O(N)

Auxiliary Space: O(N)

My Personal Notes arrow_drop_up