Obtén el k-ésimo número más pequeño usando los dígitos del número dado

Dado un número no negativo n y un valor k . Encuentra el k-ésimo número más pequeño que se puede formar usando los dígitos del número dado n . Se garantiza que se puede formar el k-ésimo número más pequeño. Tenga en cuenta que el número podría ser muy grande y es posible que ni siquiera encaje en long long int.

Ejemplos:

Input : n = 1234, k = 2
Output : 1243

Input : n = 36012679802, k = 4
Output : 10022366897

La idea es ordenar primero los dígitos y encontrar el número más pequeño, luego encontrar la k-ésima permutación comenzando desde el número más pequeño. Para ordenar los dígitos, usamos una técnica de conteo de frecuencia ya que el número de dígitos es pequeño.

// C++ implementation to get the kth smallest
// number using the digits of the given number
#include <bits/stdc++.h>
using namespace std;
  
// function to get the smallest digit in 'num'
// which is greater than 0
char getSmallDgtGreaterThanZero(string num, int n)
{
    // 's_dgt' to store the smallest digit
    // greater than 0
        char s_dgt = '9';
      
    for (int i=0; i<n; i++)
        if (num[i] < s_dgt && num[i] != '0')
            s_dgt = num[i];
      
    // required smallest digit in 'num'
    return s_dgt;
}
  
// function to get the kth smallest number
string kthSmallestNumber(string num, int k)
{
    // FIND SMALLEST POSSIBLE NUMBER BY SORTING
    // DIGITS
  
    // count frequency of each digit
    int freq[10];
    string final_num = "";
  
    memset(freq, 0, sizeof(freq));
    int n = num.size();
  
    // counting frequency of each digit
    for (int i = 0; i < n; i++)
        freq[num[i] - '0']++;
      
    // get the smallest digit greater than 0
    char s_dgt = getSmallDgtGreaterThanZero(num, n);    
      
    // add 's_dgt' to 'final_num'
    final_num += s_dgt;
      
    // reduce frequency of 's_dgt' by 1 in 'freq'
    freq[s_dgt - '0']--;
      
    // add each digit according to its frequency
    // to 'final_num'
    for (int i=0; i<10; i++)
        for (int j=1; j<=freq[i]; j++)
            final_num += (char)(i+48);    
      
    // FIND K-TH PERMUTATION OF SMALLEST NUMBER
    for (int i=1; i<k; i++)
      next_permutation(final_num.begin(), final_num.end());
      
    // required kth smallest number
    return final_num;
}
  
// Driver program to test above
int main()
{
    string num = "36012679802";
    int k = 4;
    cout << kthSmallestNumber(num, k);
    return 0;
}

Producción:

10022366897

Este artículo es una contribución de Ayush Jauhari . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *