📌  相关文章
📜  相邻数字的绝对差最大为1的第N个正数

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

给定数字N ,任务是找到第N数字,该数字在其每对相邻数字之间的绝对差为1。
例子:

方法:为了解决此问题,我们使用Queue数据结构。

  • 准备一个空的队列,并按升序将所有整数1到9排队。
  • 现在执行N次以下操作。
    • 出队并存储在数组arr中,该数组将第i个所需类型的数目存储在arr [i]中。
    • 如果(arr [i]%10!= 0),则排队10 * arr [i] +(arr [i]%10)– 1
    • 排队10 * arr [i] +(arr [i]%10)
    • 如果(arr [i]%10!= 9),则排队10 * arr [i] +(arr [i]%10)+ 1
  • 返回arr [N]作为答案。

下面是给定方法的实现:

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


输出:
45