如果数字中的所有相邻数字相差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提供上述解决方案。
锻炼:
- 将以上解决方案更改为使用DFS而不是BFS。
- 扩展您的解决方案以按排序顺序而不是任何顺序打印所有数字。
- 进一步扩展解决方案,以打印给定范围内的所有数字。