给定数字N ,任务是找到第N个数字,该数字在其每对相邻数字之间的绝对差为1。
例子:
Input : N = 5
Output : 5
Explanation:
The first 5 such numbers are 1,2,3,4 and 5.
Input : N = 15
Output : 23
Explanation:
The first 15 such numbers are 1,2,3,4,5,6,7,8,9,10,11,12,21,22 and 23.
方法:为了解决此问题,我们使用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