Entero mínimo con un máximo de K bits configurados de modo que su AND bit a bit con N sea máximo

Dado un número entero N que se puede representar en 32 bits, la tarea es encontrar otro número entero X que tenga como máximo K bits configurados en su representación binaria y AND bit a bit de X y N sea máximo.

Ejemplos: 

Entrada: N = 5, K = 1 
Salida: X = 2 
Explicación: 
La representación binaria de 5 es 101, el valor posible de X tal que maximiza AND es 2 
5 -> 101 
2 -> 100 
AND suma -> 100 ( 2) 
4 es la suma AND máxima que podemos obtener con N y X.

Entrada: N = 10, K = 2 
Salida: X = 10 
Explicación: 
La representación binaria de 10 es 1010, X = 10 entero posible al máximo dado Y suma con N con al menos 2 bits establecidos. 
10 -> 1010 
10 -> 1010 
AND suma -> 1010 (10) 
10 es la suma AND máxima que podemos obtener con N y X. 
 

 

Enfoque ingenuo: una solución ingenua es ejecutar un ciclo de 1 a N y tomar AND bit a bit con N, y también verificar si el número de bits establecidos es menor o igual a K. Durante cada iteración, mantenga el valor máximo de AND bit a bit. 
Complejidad de tiempo: O(N)

Enfoque eficiente: este problema se puede resolver de manera eficiente utilizando un enfoque codicioso en bits . Dado que N puede tener como máximo 32 bits. Entonces, comenzaremos a atravesar desde el bit más significativo y verificaremos si está configurado (o 1) en N, si no está configurado, no hay necesidad de configurar este bit porque la operación AND lo hará cero en la respuesta final, de lo contrario lo estableceremos en nuestra respuesta requerida. Además, mantendremos el conteo de bits establecidos en cada iteración y verificaremos si no excede K. 
Complejidad de tiempo: O(32)

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

C++

// C++ program for the
// above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find
// the integer with
// maximum bitwise with N
int find_max(int n, int k)
{
  // Store answer in the bitset
  // Initialized with 0
  bitset<32> X(0);
 
  // To maintain the count
  // of set bits that should
  // exceed k
  int cnt = 0;
 
  // Start traversing from the
  // Most significantif that bit
  // is set in n then we will set
  // in our answer i.e in X
  for (int i = 31; i >= 0 &&
           cnt != k; i--)
  {
    // Checking if the ith bit
    // is set in n or not
    if (n & (1 << i))
    {
      X[i] = 1;
      cnt++;
    }
  }
 
  // Converting into integer
  return X.to_ulong();
}
 
// Driver Code
int main()
{
  int n = 10, k = 2;
 
  // Function Call
  cout << find_max(n, k) <<
          endl;
 
  return 0;
}

Java

// Java program for the
// above approach
import java.util.*;
import java.lang.*;
class GFG{
 
// Function to find
// the integer with
// maximum bitwise with N
static int find_max(int n,
                    int k)
{
  // Store answer in the
  // bitset Initialized
  // with 0
  int[] X = new int[32];
 
  // To maintain the count
  // of set bits that should
  // exceed k
  int cnt = 0;
 
  // Start traversing from the
  // Most significant if that bit
  // is set in n then we will set
  // in our answer i.e in X
  for (int i = 31; i >= 0 &&
           cnt != k; i--)
  {
    // Checking if the ith bit
    // is set in n or not
    if ((n & (1 << i)) != 0)
    {
      X[i] = 1;
      cnt++;
    }
  }
 
  String s = "";
  for(int i = 31; i >= 0; i--)
    s += X[i] == 0 ? '0' : '1';
 
  // Converting into integer
  return Integer.parseInt(s,2);
}
 
// Driver function
public static void main (String[] args)
{
  int n = 10, k = 2;
 
  // Function Call
  System.out.println(find_max(n, k));
}
}
 
// This code is contributed by offbeat

Python3

# Python3 program for the above approach
 
# Function to find the integer with
# maximum bitwise with N
def find_max(n, k):
     
    # Store answer in the
    # bitset Initialized
    # with 0
    X = [0] * 32
     
    # To maintain the count
    # of set bits that should
    # exceed k
    cnt = 0
     
    # Start traversing from the
    # Most significant if that bit
    # is set in n then we will set
    # in our answer i.e in X
    i = 31
     
    while (i >= 0 and cnt != k):
         
        # Checking if the ith bit
        # is set in n or not
        if ((n & (1 << i)) != 0):
            X[i] = 1
            cnt += 1
             
        i -= 1
     
    s = ""
     
    for i in range(31, -1, -1):
        if X[i] == 0:
            s += '0'
        else:
            s += '1'
     
    # Converting into integer
    return int(s, 2)
     
# Driver code
n, k = 10, 2
 
# Function Call
print(find_max(n, k))
 
# This code is contributed by divyeshrabadiya07

C#

// C# program for the above approach
using System;
 
class GFG{
     
// Function to find the integer with
// maximum bitwise with N
static int find_max(int n, int k)
{
     
    // Store answer in the
    // bitset Initialized
    // with 0
    int[] X = new int[32];
     
    // To maintain the count
    // of set bits that should
    // exceed k
    int cnt = 0;
     
    // Start traversing from the
    // Most significant if that bit
    // is set in n then we will set
    // in our answer i.e in X
    for(int i = 31; i >= 0 && cnt != k; i--)
    {
         
        // Checking if the ith bit
        // is set in n or not
        if ((n & (1 << i)) != 0)
        {
            X[i] = 1;
            cnt++;
        }
    }
     
    String s = "";
     
    for(int i = 31; i >= 0; i--)
        s += X[i] == 0 ? '0' : '1';
     
    // Converting into integer
    return Convert.ToInt32(s, 2);
}
 
// Driver code
public static void Main(String[] args)
{
    int n = 10, k = 2;
     
    // Function Call
    Console.Write(find_max(n, k));
}
}
 
// This code is contributed by offbeat

Javascript

<script>
// javascript program for the
// above approach
 
// Function to find
// the integer with
// maximum bitwise with N
function find_max(n, k)
{
 
  // Store answer in the
  // bitset Initialized
  // with 0
  var X = Array.from({length: 32}, (_, i) => 0);
 
  // To maintain the count
  // of set bits that should
  // exceed k
  var cnt = 0;
 
  // Start traversing from the
  // Most significant if that bit
  // is set in n then we will set
  // in our answer i.e in X
  for (i = 31; i >= 0 &&
           cnt != k; i--)
  {
   
    // Checking if the ith bit
    // is set in n or not
    if ((n & (1 << i)) != 0)
    {
      X[i] = 1;
      cnt++;
    }
  }
 
  var s = "";
  for(i = 31; i >= 0; i--)
    s += X[i] == 0 ? '0' : '1';
 
  // Converting into integer
  return parseInt(s,2);
}
 
// Driver function
var n = 10, k = 2;
 
// Function Call
document.write(find_max(n, k));
 
// This code is contributed by Princi Singh
</script>
Producción

10

Análisis de rendimiento:

  • Complejidad del tiempo: O(32)
  • Espacio Auxiliar: O(1

Publicación traducida automáticamente

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