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