Encontrar el término N en una secuencia formada al eliminar el dígito K de los números naturales

Dados los números enteros N, K y una secuencia infinita de números naturales donde se eliminan todos los números que contienen el dígito K (1<=K<=9). La tarea es devolver el número N de esta secuencia.

Ejemplo:

Entrada: N = 12, K = 2
Salida: 14
Explicación: La secuencia generada para la entrada anterior sería así: 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, hasta el infinito

Entrada: N = 10, K = 1
Salida: 22

 

Enfoque ingenuo: el enfoque básico para resolver el problema anterior sería iterar hasta N y seguir excluyendo todos los números menores que N que contengan el dígito dado K. Finalmente, imprimir el N-ésimo número natural obtenido.
Complejidad temporal: O(N)
Espacio auxiliar: O(1) 

Enfoque eficiente: el enfoque eficiente para resolver esto se inspira en el número natural N después de eliminar todos los números que consisten en el dígito 9
El problema dado se puede resolver convirtiendo el valor de K a la forma base 9 si es más de 8. Se pueden seguir los pasos a continuación:

  • Calcular el enésimo número natural en formato base 9
  • Incremente 1 a cada dígito del número de base 9 que sea mayor o igual a K
  • El siguiente número es la respuesta deseada.

A continuación se muestra el código para el enfoque anterior:

C++

// C++ implementation for the above approach
 
#include <iostream>
using namespace std;
long long convertToBase9(long long n)
{
    long long ans = 0;
 
    // Denotes the digit place
    long long a = 1;
 
    // Method to convert any number
    // to binary equivalent
    while (n > 0) {
        ans += (a * (n % 9));
        a *= 10;
        n /= 9;
    }
    return ans;
}
 
long long getNthnumber(long long base9,
                       long long K)
{
    long long ans = 0;
 
    // denotes the current digits place
    long long a = 1;
    while (base9 > 0) {
        int cur = base9 % 10;
 
        // If current digit is >= K
        // increment its value by 1
        if (cur >= K) {
            ans += a * (cur + 1);
        }
 
        // Else add the digit as it is
        else {
            ans += a * cur;
        }
        base9 /= 10;
 
        // Move to the next digit
        a *= 10;
    }
    return ans;
}
 
// Driver code
int main()
{
    long long N = 10, K = 1;
    long long base9 = convertToBase9(N);
    cout << getNthnumber(base9, K);
    return 0;
}

Java

// Java implementation for the above approach
import java.io.*;
 
class GFG {
   
      static long convertToBase9(long n)
    {
        long ans = 0;
 
        // Denotes the digit place
        long a = 1;
 
        // Method to convert any number
        // to binary equivalent
        while (n > 0) {
            ans += (a * (n % 9));
            a *= 10;
            n /= 9;
        }
        return ans;
    }
 
    static long getNthnumber(long base9,
                          long K)
    {
        long ans = 0;
 
        // denotes the current digits place
        long a = 1;
        while (base9 > 0) {
            int cur = (int)(base9 % 10);
 
            // If current digit is >= K
            // increment its value by 1
            if (cur >= K) {
                ans += a * (cur + 1);
            }
 
            // Else add the digit as it is
            else {
                ans += a * cur;
            }
            base9 /= 10;
 
            // Move to the next digit
            a *= 10;
        }
        return ans;
    }
 
    // Driver code
    public static void main (String[] args) {
        long N = 10, K = 1;
        long base9 = convertToBase9(N);
        System.out.println(getNthnumber(base9, K));
    }
}
 
//  This code is contributed by Dharanendra L V.

Python3

# Python 3 implementation for the above approach
def convertToBase9(n):
    ans = 0
     
    # Denotes the digit place
    a = 1
 
    # Method to convert any number
    # to binary equivalent
    while(n > 0):
        ans += (a * (n % 9))
        a *= 10
        n //= 9
    return ans
 
def getNthnumber(base9, K):
    ans = 0
 
    # denotes the current digits place
    a = 1
    while (base9 > 0):
        cur = base9 % 10
 
        # If current digit is >= K
        # increment its value by 1
        if (cur >= K):
            ans += a * (cur + 1)
 
        # Else add the digit as it is
        else:
            ans += a * cur
        base9 //= 10
 
        # Move to the next digit
        a *= 10
    return ans
 
# Driver code
if __name__ == '__main__':
    N = 10
    K = 1
    base9 = convertToBase9(N)
    print(getNthnumber(base9, K))
     
    # This code is contributed by SURENDRA_GANGWAR.

C#

// C# implementation for the above approach
using System;
 
class GFG {
   
      static long convertToBase9(long n)
    {
        long ans = 0;
 
        // Denotes the digit place
        long a = 1;
 
        // Method to convert any number
        // to binary equivalent
        while (n > 0) {
            ans += (a * (n % 9));
            a *= 10;
            n /= 9;
        }
        return ans;
    }
 
    static long getNthnumber(long base9,
                          long K)
    {
        long ans = 0;
 
        // denotes the current digits place
        long a = 1;
        while (base9 > 0) {
            int cur = (int)(base9 % 10);
 
            // If current digit is >= K
            // increment its value by 1
            if (cur >= K) {
                ans += a * (cur + 1);
            }
 
            // Else add the digit as it is
            else {
                ans += a * cur;
            }
            base9 /= 10;
 
            // Move to the next digit
            a *= 10;
        }
        return ans;
    }
 
    // Driver code
    public static void Main (String[] args) {
        long N = 10, K = 1;
        long base9 = convertToBase9(N);
        Console.Write(getNthnumber(base9, K));
    }
}
 
//  This code is contributed by shivanisinghss2110

Javascript

<script>
// Javascript implementation for the above approach
function convertToBase9(n)
{
  let ans = 0;
 
  // Denotes the digit place
  let a = 1;
 
  // Method to convert any number
  // to binary equivalent
  while (n > 0) {
    ans += a * (n % 9);
    a *= 10;
    n = Math.floor(n / 9);
  }
  return ans;
}
 
function getNthnumber(base9, K) {
  let ans = 0;
 
  // denotes the current digits place
  let a = 1;
  while (base9 > 0) {
    let cur = base9 % 10;
 
    // If current digit is >= K
    // increment its value by 1
    if (cur >= K) {
      ans += a * (cur + 1);
    }
 
    // Else add the digit as it is
    else {
      ans += a * cur;
    }
    base9 = Math.floor(base9 / 10);
 
    // Move to the next digit
    a *= 10;
  }
  return ans;
}
 
// Driver code
let N = 10,
  K = 1;
let base9 = convertToBase9(N);
document.write(getNthnumber(base9, K));
 
// This code is contributed by gfgking.
</script>
Producción: 

22

 

Complejidad de Tiempo: O(log 9 N)
Espacio Auxiliar: O(1) 

Publicación traducida automáticamente

Artículo escrito por mahim_mittal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *