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

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to find Nth number with
// absolute difference between all
// adjacent digits at most 1.
 
#include <bits/stdc++.h>
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<<arr[N]<<endl;
}
 
// Driver Code
int main()
{
    int N = 21;
    findNthNumber(N);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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<Integer> 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Output: 

45


 

competitive-programming-img




My Personal Notes arrow_drop_up

Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.