Print all Jumping Numbers smaller than or equal to a given value

11 Jul, 2022
A number is called as a Jumping Number if all adjacent digits in it differ by 1. The difference between ‘9’ and ‘0’ is not considered as 1. All single digit numbers are considered as Jumping Numbers. For example 7, 8987 and 4343456 are Jumping numbers but 796 and 89098 are not. Given a positive number x, print all Jumping Numbers smaller than or equal to x. The numbers can be printed in any order.
Example: 
Input: x = 20
Output:  0 1 2 3 4 5 6 7 8 9 10 12

Input: x = 105
Output:  0 1 2 3 4 5 6 7 8 9 10 12
         21 23 32 34 43 45 54 56 65
         67 76 78 87 89 98 101

Note: Order of output doesn't matter, 
i.e. numbers can be printed in any order
One Simple Solution is to traverse all numbers from 0 to x. For every traversed number, check if it is a Jumping number. If yes, then print it. Otherwise ignore it.
C++14
Java
Python3
C#
Javascript
#include <bits/stdc++.h> using namespace std; void print_sieve(int& x){    int i,temp,digit;    bool check;         for(i=0;i<=x;i++)    {        if(i<10)        {            cout<<i<<" ";            continue;        }        check=1;        temp=i;        digit=temp%10;        temp/=10;        while(temp)        {            if(abs(digit-temp%10)!=1)            {                check=0;                break;            }            digit=temp%10;            temp/=10;        }        if(check)        cout<<i<<" ";    }} int main(){    int x=105;    print_sieve(x);     return 0;}
// Java program to implement// the above approachimport java.util.*;import java.lang.*;import java.io.*; class GFG{  public static void print_sieve(int x)  {    int i, temp, digit;    int check;      for(i = 0; i <= x; i++)    {      if(i < 10)      {        System.out.print(i + " ");        continue;      }      check = 1;      temp = i;      digit = temp % 10;      temp /= 10;      while(temp != 0)      {        if(Math.abs(digit - temp % 10) != 1)        {          check = 0;          break;        }        digit = temp % 10;        temp /= 10;      }      if(check != 0)        System.out.print(i + " ");    }  }    // Driver Code  public static void main(String[] args)  {    int x = 105;    print_sieve(x);  }} // This code is contributed by Pushpesh Raj.
# Python3 program to implement the approach # Function to print the jumping numbers# in the range [0, x]def print_sieve(x):     # iterating over all the numbers    # in the range [0, x]    for i in range(x + 1):        if(i < 10):             # all numbers in [0, 9] are            # jumping numbers            print(i, end=" ")            continue         # the variable check tracks if        # the number is valid        check = 1        temp = i        digit = temp % 10        temp //= 10        while(temp > 0):             if(abs(digit - temp % 10) != 1):                 check = 0                break             digit = temp % 10            temp //= 10         # printing i if check is 1        if(check):            print(i, end=" ") # Driver Codex = 105print_sieve(x) # This code is contributed by phasing17
// C# program to implement// the above approachusing System; class GFG{   static void print_sieve(int x)  {    int i, temp, digit;    int check;     for(i = 0; i <= x; i++)    {      if(i < 10)      {        Console.Write(i + " ");        continue;      }      check = 1;      temp = i;      digit = temp % 10;      temp /= 10;      while(temp != 0)      {        if(Math.Abs(digit - temp % 10) != 1)        {          check = 0;          break;        }        digit = temp % 10;        temp /= 10;      }      if(check != 0)        Console.Write(i + " ");    }  }   // Driver Code  public static void Main()  {    int x = 105;    print_sieve(x);  }} // This code is contributed by code_hunt.
<script> function print_sieve(x){    let i,temp,digit;    let check;         for(i = 0; i <= x; i++)    {        if(i < 10)        {            document.write(i," ");            continue;        }        check = 1;        temp = i;        digit = temp % 10;        temp = Math.floor(temp / 10);        while(temp)        {            if(Math.abs(digit - temp % 10) != 1)            {                check = 0;                break;            }            digit = temp % 10;            temp = Math.floor(temp / 10);        }        if(check)            document.write(i," ");    }} let x = 105;print_sieve(x); // This code is contributed by shinjanpatra </script>
0 1 2 3 4 5 6 7 8 9 10 12 21 23 32 34 43 45 54 56 65 67 76 78 87 89 98 101 
Time Complexity: O(x)Auxiliary Space: O(1)
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
An Efficient Solution can solve this problem in O(k) time where k is number of Jumping Numbers smaller than or equal to x. The idea is use BFS or DFS. Assume that we have a graph where the starting node is 0 and we need to traverse it from the start node to all the reachable nodes.
With the restrictions given in the graph about the jumping numbers, what do you think should be the restrictions defining the next transitions in the graph.
Lets take a example for input x = 90

Start node = 0
From 0, we can move to 1 2 3 4 5 6 7 8 9 
[these are not in our range so we don't add it]

Now from 1, we can move to 12 and 10 
From 2, 23 and 21
From 3, 34 and 32
.
.
.
.
.
.
and so on.
Below is BFS based implementation of above idea. 
C++
Java
Python3
C#
Javascript
// Finds and prints all jumping numbers smaller than or// equal to x.#include <bits/stdc++.h>using namespace std; // Prints all jumping numbers smaller than or equal to x starting// with 'num'. It mainly does BFS starting from 'num'.void bfs(int x, int num){    // Create a queue and enqueue 'i' to it    queue<int> q;    q.push(num);     // Do BFS starting from i    while (!q.empty()) {        num = q.front();        q.pop();         if (num <= x) {            cout << num << " ";            int last_dig = num % 10;             // If last digit is 0, append next digit only            if (last_dig == 0)                q.push((num * 10) + (last_dig + 1));             // If last digit is 9, append previous digit only            else if (last_dig == 9)                q.push((num * 10) + (last_dig - 1));             // If last digit is neither 0 nor 9, append both            // previous and next digits            else {                q.push((num * 10) + (last_dig - 1));                q.push((num * 10) + (last_dig + 1));            }        }    }} // Prints all jumping numbers smaller than or equal to// a positive number xvoid printJumping(int x){    cout << 0 << " ";    for (int i = 1; i <= 9 && i <= x; i++)        bfs(x, i);} // Driver programint main(){    int x = 40;    printJumping(x);    return 0;}
// Finds and prints all jumping numbers smaller than or// equal to x.import java.util.*;import java.lang.*;import java.io.*; class GFG {     // Prints all jumping numbers smaller than or equal to x starting    // with 'num'. It mainly does BFS starting from 'num'.    public void bfs(int x, int num)    {        // Create a queue and enqueue 'i' to it        Queue<Integer> q = new LinkedList<Integer>();        q.add(num);         // Do BFS starting from i        while (!q.isEmpty()) {            num = q.peek();            q.poll();            if (num <= x) {                System.out.print(num + " ");                int last_digit = num % 10;                 // If last digit is 0, append next digit only                if (last_digit == 0) {                    q.add((num * 10) + (last_digit + 1));                }                 // If last digit is 9, append previous digit only                else if (last_digit == 9) {                    q.add((num * 10) + (last_digit - 1));                }                 // If last digit is neither 0 nor 9, append both                // previous and next digits                else {                    q.add((num * 10) + (last_digit - 1));                    q.add((num * 10) + (last_digit + 1));                }            }        }    }     // Prints all jumping numbers smaller than or equal to    // a positive number x    public void printJumping(int x)    {        System.out.print("0 ");         for (int i = 1; i <= 9 && i <= x; i++) {            this.bfs(x, i);        }    }     // Driver program    public static void main(String[] args) throws IOException    {        int x = 40;        GFG obj = new GFG();        obj.printJumping(x);    }}
# Class queue for use laterclass Queue:    def __init__(self):        self.lst = []     def is_empty(self):        return self.lst == []     def enqueue(self, elem):        self.lst.append(elem)     def dequeue(self):        return self.lst.pop(0) # Prints all jumping numbers smaller than or equal to# x starting with 'num'. It mainly does BFS starting# from 'num'.def bfs(x, num):     # Create a queue and enqueue i to it    q = Queue()    q.enqueue(num)     # Do BFS starting from 1    while (not q.is_empty()):        num = q.dequeue()         if num<= x:            print(str(num), end =' ')            last_dig = num % 10             # If last digit is 0, append next digit only            if last_dig == 0:                q.enqueue((num * 10) + (last_dig + 1))             # If last digit is 9, append previous digit            # only            elif last_dig == 9:                q.enqueue((num * 10) + (last_dig - 1))             # If last digit is neither 0 nor 9, append            # both previous digit and next digit            else:                q.enqueue((num * 10) + (last_dig - 1))                q.enqueue((num * 10) + (last_dig + 1)) # Prints all jumping numbers smaller than or equal to# a positive number xdef printJumping(x):    print (str(0), end =' ')    for i in range(1, 10):        bfs(x, i) # Driver Program ( Change value of x as desired )x = 40printJumping(x) # This code is contributed by Saket Modi
// C# program to finds and prints all jumping// numbers smaller than or equal to x.using System;using System.Collections.Generic; class GFG{     // Prints all jumping numbers smaller than or    // equal to x starting with 'num'. It mainly    // does BFS starting from 'num'.    public void bfs(int x, int num)    {        // Create a queue and enqueue 'i' to it        Queue<int> q = new Queue<int>();        q.Enqueue(num);         // Do BFS starting from i        while (q.Count!=0)        {            num = q.Peek();            q.Dequeue();            if (num <= x)            {                Console.Write(num + " ");                int last_digit = num % 10;                 // If last digit is 0, append next digit only                if (last_digit == 0)                {                    q.Enqueue((num * 10) + (last_digit + 1));                }                 // If last digit is 9, append previous digit only                else if (last_digit == 9)                {                    q.Enqueue((num * 10) + (last_digit - 1));                }                 // If last digit is neither 0 nor 9, append both                // previous and next digits                else                {                    q.Enqueue((num * 10) + (last_digit - 1));                    q.Enqueue((num * 10) + (last_digit + 1));                }            }        }    }     // Prints all jumping numbers smaller than or equal to    // a positive number x    public void printJumping(int x)    {        Console.Write("0 ");         for (int i = 1; i <= 9 && i <= x; i++)        {            this.bfs(x, i);        }    }     // Driver code    public static void Main(String[] args)    {        int x = 40;        GFG obj = new GFG();        obj.printJumping(x);    }} // This code has been contributed by 29AjayKumar
<script> // Finds and prints all jumping numbers// smaller than or equal to x. // Prints all jumping numbers smaller than// or equal to x starting with 'num'. It// mainly does BFS starting from 'num'.function bfs(x, num){         // Create a queue and enqueue 'i' to it    let q = [];    q.push(num);     // Do BFS starting from i    while (q.length != 0)    {        num = q.shift();                 if (num <= x)        {            document.write(num + " ");            let last_digit = num % 10;             // If last digit is 0, append next digit only            if (last_digit == 0)            {                q.push((num * 10) + (last_digit + 1));            }             // If last digit is 9, append previous            // digit only            else if (last_digit == 9)            {                q.push((num * 10) + (last_digit - 1));            }             // If last digit is neither 0 nor 9,            // append both previous and next digits            else            {                q.push((num * 10) + (last_digit - 1));                q.push((num * 10) + (last_digit + 1));            }        }    }} // Prints all jumping numbers smaller// than or equal to a positive number xfunction printJumping(x){    document.write("0 ");       for(let i = 1; i <= 9 && i <= x; i++)    {        bfs(x, i);    }} // Driver codelet x = 40;printJumping(x); // This code is contributed by rag2127 </script>
0 1 10 12 2 21 23 3 32 34 4 5 6 7 8 9 
Time Complexity: O(k) time where k is number of Jumping Numbers smaller than or equal to xAuxiliary Space: O(1)
Thanks to Gaurav Ahirwar for above solution.
Exercise: 
Change the above solution to use DFS instead of BFS.Extend your solution to print all numbers in sorted order instead of any order.Further extend the solution to print all numbers in a given range.
Change the above solution to use DFS instead of BFS.
Extend your solution to print all numbers in sorted order instead of any order.
Further extend the solution to print all numbers in a given range.
fruit_jam
SachinSinghLodhi
29AjayKumar
rag2127
prophet1999
simmytarika5
shinjanpatra
code_hunt
pushpeshrajdx01
hardikkoriintern
phasing17
Amazon
BankBazaar
BFS
DFS
Directi
Google
Microsoft
Moonfrog Labs
Opera
Oracle
Zycus
Arrays
Graph
Mathematical
Moonfrog Labs
Amazon
Microsoft
Oracle
Directi
Google
BankBazaar
Opera
Zycus
Arrays
Mathematical
DFS
Graph
BFS
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.