Encuentre el siguiente número mayor formado con exactamente dos dígitos únicos para cada elemento de Array

Dada una array arr[] que tiene N enteros, la tarea es encontrar el siguiente número mayor X , es decir, X >= arr[i] para cada i en el rango [0, N) tal que el recuento de dígitos únicos en X sea exactamente 2 _

Ejemplo:

Entrada: arr[] = {123, 234}
Salida: 131 242
Explicación: Para la array dada, 131 es el número más pequeño mayor que 123 que tiene exactamente 2 dígitos únicos. De manera similar, 242 es el número más pequeño mayor que 234 que tiene exactamente 2 dígitos únicos.

Entrada: arr[] = {35466666}
Salida: 35533333

 

Enfoque ingenuo: el problema dado se puede resolver iterando sobre todos los enteros mayores que arr[i] para cada i en el rango [0, N) y haciendo un seguimiento de los primeros enteros de modo que el recuento de dígitos únicos en el entero sea exactamente 2

Complejidad temporal: O(N * M), donde M representa el elemento máximo en el arr[].  
Espacio auxiliar: O(log N)

Enfoque eficiente: el enfoque anterior se puede optimizar utilizando Bitmasking . Se puede observar que todos los números enteros que tienen dos dígitos en el rango dado se pueden calcular iterando sobre todos los pares posibles de dos dígitos únicos y generando todos los dígitos que se pueden formar a partir de ellos. Puede ser hecho por el algoritmo discutido en este artículo. Posteriormente, se puede usar una estructura de datos establecida para almacenar todos los enteros, y para cada valor de arr[i] , se puede encontrar el entero más pequeño mayor que arr[i] usando la función lower_bound usando la búsqueda binaria .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program of the above approach
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
 
// Stores the set of integers with 2 unique digits
set<int> helper;
vector<int> nums;
 
// Function to find the value of a^b
int power(int a, int b)
{
 
    // Stores the value
    int ans = 1;
    while (b > 0) {
        if (b & 1) {
            ans = ans * a;
        }
        b = b >> 1;
        a = a * a;
    }
 
    // Return Answer
    return ans;
}
 
void nextGreaterEle(int arr[], int N)
{
 
    // Loop to iterate the given array
    for (int i = 0; i < N; i++) {
 
        // For each array element, find next
        // greater element in the vector nums
        // of integers using lower_bound
        cout << *lower_bound(nums.begin(), nums.end(),
                             arr[i])
             << " ";
    }
}
 
// Function to calculate the digits having
// exactly two unique digits
void preProcess()
{
    // Loop to iterate over all possible
    // pairs of digits from 0 to 9
    for (int i = 0; i <= 9; i++) {
        for (int j = 0; j <= 9; j++) {
 
            // Stores the maximum length of integer
            int len = 10;
            for (int k = 0; k <= (1 << len); k++) {
                int temp = k;
                int number = 0;
                int curLen = 0;
                while (temp > 0) {
                    if (temp & 1) {
 
                        // Include numbers with the
                        // next digit as i
                        number = i * power(10, curLen)
                                 + number;
                    }
                    else {
 
                        // Include numbers with the next
                        // next digit as j
                        number = j * power(10, curLen)
                                 + number;
                    }
 
                    // Update temp
                    temp = (temp >> 1);
                    curLen++;
                }
 
                // Insert the current number into the set
                helper.insert(number);
                while (curLen <= len) {
                    number = j * power(10, curLen) + number;
                    helper.insert(number);
                    curLen++;
                }
            }
        }
    }
 
    // Loop to insert all the integers into
    // a vector from the set if the unique digits
    // in the integer is exactly two.
    for (auto cur : helper) {
 
        // Stores the unique digits
        set<int> count;
        int orz = cur;
        while (cur > 0) {
            count.insert(cur % 10);
            cur = cur / 10;
        }
 
        // If count of exactly two
        if (count.size() == 2) {
            nums.push_back(orz);
        }
    }
}
 
// Driver Code
signed main()
{
    int arr[] = { 123, 234 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    preProcess();
    nextGreaterEle(arr, N);
 
    return 0;
}

Python3

## Python program for the above approach:
 
import bisect
 
## Stores the set of integers with 2 unique digits
helper = set({})
nums = []
 
## Function to find the value of a^b
def power(a, b):
 
    ## Stores the value
    ans = 1;
    while (b > 0):
        if (b & 1) == 1:
            ans = ans * a;
        b = b // 2;
        a = a * a;
 
    ## Return Answer
    return ans;
 
def nextGreaterEle(arr, N):
 
    ## Loop to iterate the given array
    for i in range(0, N):
 
        ## For each array element, find next
        ## greater element in the vector nums
        ## of integers using lower_bound
        print(nums[bisect.bisect_left(nums, arr[i])], end=" ")
    print("")
 
## Function to calculate the digits having
## exactly two unique digits
def preProcess():
    ## Loop to iterate over all possible
    ## pairs of digits from 0 to 9
    for i in range(0, 10):
        for j in range(0, 10):
 
            ## Stores the maximum length of integer
            leng = 10
            for k in range(0, (1<<leng) + 1):
                temp = k
                number = 0
                curLen = 0
                while (temp > 0):
                    if (temp & 1) == 1:
 
                        ## Include numbers with the
                        ## next digit as i
                        number = i * power(10, curLen) + number;
                    else:
 
                        ## Include numbers with the next
                        ## next digit as j
                        number = j * power(10, curLen) + number;
 
                    ## Update temp
                    temp = (temp // 2);
                    curLen+=1
 
                ## Insert the current number into the set
                helper.add(number);
                while curLen <= leng:
                    number = j * power(10, curLen) + number;
                    helper.add(number);
                    curLen+=1
 
    ## Loop to insert all the integers into
    ## a vector from the set if the unique digits
    ## in the integer is exactly two.
    for cur in helper:
 
        ## Stores the unique digits
        count = set({})
        orz = cur
        while (cur > 0):
            count.add(cur % 10)
            cur = cur // 10
 
        ## If count of exactly two
        if len(count) == 2:
            nums.append(orz)
    nums.sort()
 
## Driver code
if __name__=='__main__':
 
    arr = [ 123, 234 ];
    N = len(arr)
 
    preProcess()
    nextGreaterEle(arr, N)
     
    # This code is contributed by subhamgoyal2014.
Producción

131 242 

Complejidad de tiempo: O(10 6 + N * log N) = O(N * log N)
Espacio auxiliar: O(10 6 ) = O(1)

Publicación traducida automáticamente

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