Encuentre el K-ésimo número más pequeño tal que A + B = A | B

Dados dos números A y K , la tarea es encontrar el K-ésimo entero positivo más pequeño B, tal que A + B = A | B , donde | denota el operador OR bit a bit.

Ejemplos: 

Input: A = 10, K = 3
Output: 5
Explanation:
K = 1, 10 + 1 = 10 | 1 = 11
K = 2, 10 + 4 = 10 | 4 = 14
K = 3, 10 + 5 = 10 | 5 = 15

Input: A = 1, B = 1
Output: 2 

Acercarse:

  • B es una solución de la ecuación dada si y solo si B tiene 0 en todas las posiciones donde A tiene 1 (en notación binaria).
  • Entonces, necesitamos determinar el bit de B para las posiciones donde A tiene 0. Si A = 10100001, entonces los últimos ocho dígitos de B deben ser 0_0____0, donde _ denota 0 o 1. Cualquier reemplazo de todos _ por 0 o 1 nos da una solución.
  • El k-ésimo número más pequeño se recibirá reemplazando todo _ en y por dígitos de la representación binaria del número k.

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

C++

// C++ program for the
// above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find k'th
// smallest number such that
// A + B = A | B
long long kthSmallest(long long a, long long k)
{
 
    // res will store
    // final answer
    long long res = 0;
    long long j = 0;
 
    for (long long i = 0; i < 32; i++) {
 
        // Skip when j'th position
        // has 1 in binary representation
        // as in res, j'th position will be 0.
        while (j < 32 && (a & (1 << j))) {
            // j'th bit is set
            j++;
        }
 
        // If i'th bit of k is 1
        // and i'th bit of j is 0
        // then set i'th bit in res.
        if (k & (1 << i)) {
            res |= (1LL << j);
        }
 
        // Proceed to next bit
        j++;
    }
 
    return res;
}
 
// Driver Code
int main()
{
 
    long long a = 5, k = 3;
    cout << kthSmallest(a, k) << "\n";
 
    return 0;
}

Python3

# Python3 program for the above approach
 
# Function to find k'th
# smallest number such that
# A + B = A | B
def kthSmallest(a, k):
 
    # res will store
    # final answer
    res = 0
    j = 0
 
    for i in range(32):
 
        # Skip when j'th position
        # has 1 in binary representation
        # as in res, j'th position will be 0.
        while (j < 32 and (a & (1 << j))):
             
            # j'th bit is set
            j += 1
 
        # If i'th bit of k is 1
        # and i'th bit of j is 0
        # then set i'th bit in res.
        if (k & (1 << i)):
            res |= (1 << j)
 
        # Proceed to next bit
        j += 1
 
    return res
 
# Driver Code
a = 5
k = 3
 
print(kthSmallest(a, k))
 
# This code is contributed by himanshu77

Javascript

<script>
 
// Javascript program for the
// above approach
 
// Function to find k'th
// smallest number such that
// A + B = A | B
function kthSmallest(a, k)
{
   
    // res will store
    // final answer
    let res = 0;
    let j = 0;
   
    for (let i = 0; i < 32; i++) {
   
        // Skip when j'th position
        // has 1 in binary representation
        // as in res, j'th position will be 0.
        while (j < 32 && (a & (1 << j))) {
            // j'th bit is set
            j++;
        }
   
        // If i'th bit of k is 1
        // and i'th bit of j is 0
        // then set i'th bit in res.
        if (k & (1 << i)) {
            res |= (1 << j);
        }
   
        // Proceed to next bit
        j++;
    }
   
    return res;
}
 
// Driver Code
     
    let a = 5, k = 3;
    document.write(kthSmallest(a, k));
         
</script>

Java

// Java program for above approach
import java.util.*;
 
class GFG
{
 
    // Function to find k'th
// smallest number such that
// A + B = A | B
static int kthSmallest(int a, int k)
{
 
    // res will store
    // final answer
    int res = 0;
    int j = 0;
 
    for (int i = 0; i < 32; i++) {
 
        // Skip when j'th position
        // has 1 in binary representation
        // as in res, j'th position will be 0.
        while (j < 32 && (a & (1 << j)) != 0) {
            // j'th bit is set
            j++;
        }
 
        // If i'th bit of k is 1
        // and i'th bit of j is 0
        // then set i'th bit in res.
        if (k != 0 & (1 << i) != 0) {
            res |= (50 << j);
        }
 
        // Proceed to next bit
        j++;
    }
 
    return (-res);
}
 
    public static void main(String[] args) {
        int a = 5, k = 3;
        System.out.println(kthSmallest(a, k));
    }
}
Producción: 

10

 

Complejidad del tiempo: O(log(n))

Espacio Auxiliar: O(1)
 

Publicación traducida automáticamente

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