📜  打印所有小于或等于给定值的跳数

📅  最后修改于: 2021-05-07 10:06:42             🧑  作者: Mango

如果数字中的所有相邻数字相差1,则称为跳数。“ 9”和“ 0”之间的差不视为1。
所有单位数字都视为跳号。例如,7 8987和4343456是跳跃数,而796和89098不是。

给定正数x,请打印所有小于或等于x的跳数。数字可以按任何顺序打印。

例子:

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

我们强烈建议您单击此处并进行实践,然后再继续解决方案。

一种简单的解决方案是遍历从0到x的所有数字。对于每个遍历的数字,请检查它是否为跳跃数。如果是,则打印它。否则忽略它。该解决方案的时间复杂度为O(x)。

有效解决方案可以在O(k)时间内解决此问题,其中k是小于或等于x的跳跃数的数量。这个想法是使用BFS或DFS。

假设我们有一个图,其中起始节点为0,我们需要将其从起始节点遍历到所有可到达的节点。

鉴于图表中给出的关于跳跃数的限制,您认为应该是定义图表中下一个过渡的限制。

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.

下面是上述想法的基于BFS的实现。

C++
// Finds and prints all jumping numbers smaller than or
// equal to x.
#include 
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 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 neighter 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 x
void printJumping(int x)
{
    cout << 0 << " ";
    for (int i = 1; i <= 9 && i <= x; i++)
        bfs(x, i);
}
  
// Driver program
int main()
{
    int x = 40;
    printJumping(x);
    return 0;
}


Java
// 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 q = new LinkedList();
        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 neighter 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);
    }
}


Python 3
# Class queue for use later
class 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 neighter 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 x
def printJumping(x):
    print (str(0), end =' ')
    for i in range(1, 10):
        bfs(x, i)
  
# Driver Program ( Change value of x as desired )
x = 40
printJumping(x)
  
# This code is contributed by Saket Modi


C#
// 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 q = new Queue();
        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 neighter 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


输出:

0 1 10 12 2 21 23 3 32 34 4 5 6 7 8 9 

感谢Gaurav Ahirwar提供上述解决方案。

锻炼:

  1. 将以上解决方案更改为使用DFS而不是BFS。
  2. 扩展您的解决方案以按排序顺序而不是任何顺序打印所有数字。
  3. 进一步扩展解决方案,以打印给定范围内的所有数字。