📜  打印第N个单步编号或自传编号

📅  最后修改于: 2021-04-24 21:05:16             🧑  作者: Mango

给定自然数N ,任务是打印第N个步进数或自传数。

例子:

Input: N = 16 
Output: 32
Explanation:
16th Stepping number is 32.

Input: N = 14 
Output: 22
Explanation:
14th Stepping number is 22.

方法:使用队列数据结构可以解决此问题。首先,准备一个空队列,然后按此顺序将1、2,…,9入队
然后,为了生成第N个步进编号,必须将以下操作执行N次:

  • 从队列中执行出队。令x为出队元素。
  • 如果x mod 10不等于0,则入队10x +(x mod 10)– 1
  • 入队10x +(x mod 10)。
  • 如果x mod 10不等于9,则入队10x +(x mod 10)+ 1。

在第N个操作中出队的编号是第N个步进编号。

下面是上述方法的实现:

C++
// C++ implementation to find
// N’th stepping natural Number
#include 
using namespace std;
  
// Function to find the
// Nth stepping natural number
int NthSmallest(int K)
{
  
    // Declare the queue
    queue Q;
  
    int x;
  
    // Enqueue 1, 2, ..., 9 in this order
    for (int i = 1; i < 10; i++)
        Q.push(i);
  
    // Perform K operation on queue
    for (int i = 1; i <= K; i++) {
  
        // Get the ith Stepping number
        x = Q.front();
  
        // Perform Dequeue from the Queue
        Q.pop();
  
        // If x mod 10 is not equal to 0
        if (x % 10 != 0) {
  
            // then Enqueue 10x + (x mod 10) - 1
            Q.push(x * 10 + x % 10 - 1);
        }
  
        // Enqueue 10x + (x mod 10)
        Q.push(x * 10 + x % 10);
  
        // If x mod 10 is not equal to 9
        if (x % 10 != 9) {
  
            // then Enqueue 10x + (x mod 10) + 1
            Q.push(x * 10 + x % 10 + 1);
        }
    }
  
    // Return the dequeued number of the K-th
    // operation as the Nth stepping number
    return x;
}
  
// Driver Code
int main()
{
  
    // initialise K
    int N = 16;
  
    cout << NthSmallest(N) << "\n";
  
    return 0;
}


Java
// Java implementation to find
// N'th stepping natural Number
import java.util.*;
  
class GFG{
   
// Function to find the
// Nth stepping natural number
static int NthSmallest(int K)
{
   
    // Declare the queue
    Queue Q = new LinkedList<>();
   
    int x = 0;
   
    // Enqueue 1, 2, ..., 9 in this order
    for (int i = 1; i < 10; i++)
        Q.add(i);
   
    // Perform K operation on queue
    for (int i = 1; i <= K; i++) {
   
        // Get the ith Stepping number
        x = Q.peek();
   
        // Perform Dequeue from the Queue
        Q.remove();
   
        // If x mod 10 is not equal to 0
        if (x % 10 != 0) {
   
            // then Enqueue 10x + (x mod 10) - 1
            Q.add(x * 10 + x % 10 - 1);
        }
   
        // Enqueue 10x + (x mod 10)
        Q.add(x * 10 + x % 10);
   
        // If x mod 10 is not equal to 9
        if (x % 10 != 9) {
   
            // then Enqueue 10x + (x mod 10) + 1
            Q.add(x * 10 + x % 10 + 1);
        }
    }
   
    // Return the dequeued number of the K-th
    // operation as the Nth stepping number
    return x;
}
   
// Driver Code
public static void main(String[] args)
{
   
    // initialise K
    int N = 16;
   
    System.out.print(NthSmallest(N));
}
}
  
// This code is contributed by 29AjayKumar


Python3
# Python3 implementation to find
# N’th stepping natural Number
  
# Function to find the
# Nth stepping natural number
def NthSmallest(K):
    # Declare the queue
    Q = []
  
    # Enqueue 1, 2, ..., 9 in this order
    for i in range(1,10):
        Q.append(i)
  
    # Perform K operation on queue
    for i in range(1,K+1):
        # Get the ith Stepping number
        x = Q[0]
  
        # Perform Dequeue from the Queue
        Q.remove(Q[0])
  
        # If x mod 10 is not equal to 0
        if (x % 10 != 0):
            # then Enqueue 10x + (x mod 10) - 1
            Q.append(x * 10 + x % 10 - 1)
  
        # Enqueue 10x + (x mod 10)
        Q.append(x * 10 + x % 10)
  
        # If x mod 10 is not equal to 9
        if (x % 10 != 9):
            # then Enqueue 10x + (x mod 10) + 1
            Q.append(x * 10 + x % 10 + 1)
  
    # Return the dequeued number of the K-th
    # operation as the Nth stepping number
    return x
  
# Driver Code
if __name__ == '__main__':
    # initialise K
    N = 16
  
    print(NthSmallest(N))
  
# This code is contributed by Surendra_Gangwar


C#
// C# implementation to find
// N'th stepping natural Number
using System;
using System.Collections.Generic;
  
class GFG{
    
// Function to find the
// Nth stepping natural number
static int NthSmallest(int K)
{
    
    // Declare the queue
    List Q = new List();
    
    int x = 0;
    
    // Enqueue 1, 2, ..., 9 in this order
    for (int i = 1; i < 10; i++)
        Q.Add(i);
    
    // Perform K operation on queue
    for (int i = 1; i <= K; i++) {
    
        // Get the ith Stepping number
        x = Q[0];
    
        // Perform Dequeue from the Queue
        Q.RemoveAt(0);
    
        // If x mod 10 is not equal to 0
        if (x % 10 != 0) {
    
            // then Enqueue 10x + (x mod 10) - 1
            Q.Add(x * 10 + x % 10 - 1);
        }
    
        // Enqueue 10x + (x mod 10)
        Q.Add(x * 10 + x % 10);
    
        // If x mod 10 is not equal to 9
        if (x % 10 != 9) {
    
            // then Enqueue 10x + (x mod 10) + 1
            Q.Add(x * 10 + x % 10 + 1);
        }
    }
    
    // Return the dequeued number of the K-th
    // operation as the Nth stepping number
    return x;
}
    
// Driver Code
public static void Main(String[] args)
{
    
    // initialise K
    int N = 16;
    
    Console.Write(NthSmallest(N));
}
}
  
// This code is contributed by sapnasingh4991


输出:
32

时间复杂度: O(N)