Réduire XOR

Susan Sarandon
Libérer: 2025-01-16 11:32:58
original
224 Les gens l'ont consulté

Minimize XOR

2429. Réduire XOR

Difficulté :Moyen

Sujets : Gourmands, manipulation de bits

Ce problème vous met au défi de trouver un entier positif, x, qui remplit deux conditions : il a le même nombre de bits définis (1 dans sa représentation binaire) qu'un entier donné, num2, et son XOR au niveau du bit avec un autre entier donné, num1, est minimisé.

Exemple 1 :

  • Entrée : num1 = 3, num2 = 5
  • Sortie : 3
  • Explication : 3 (0011) et 5 (0101) ont tous deux deux bits définis. 3 XOR 3 = 0, qui est la valeur XOR minimale possible.

Exemple 2 :

  • Entrée : num1 = 1, num2 = 12
  • Sortie : 3
  • Explication : 12 (1100) a deux bits définis. 3 (0011) a également deux bits définis, et 3 XOR 1 = 2.

Contraintes :

  • 1 ≤ num1, num2 ≤ 109

Approche de la solution :

La clé est une stratégie gourmande. Pour minimiser le résultat XOR, nous souhaitons aligner autant que possible les bits définis de x avec les bits définis de num1.

  1. Compter les bits définis : Déterminez le nombre de bits définis dans num2. Appelons cela targetBits.

  2. Construisez x : Initialisez x à 0. Parcourez les bits de num1, en commençant par le bit le plus significatif. Pour chaque bit défini dans num1, si nous n'avons pas encore atteint targetBits, ajoutez ce bit à x. Si nous avons déjà satisfait à l'exigence targetBits, sautez cette étape. Si nous n'avons pas atteint targetBits après avoir traité tous les bits de num1, ajoutez les bits restants à x, en commençant par le bit le moins significatif.

  3. Retour x : Le x construit satisfera aux conditions.

Implémentation PHP :

<code class="language-php"><?php
function minimizeXor(int $num1, int $num2): int {
    $targetBits = countSetBits($num2);
    $x = 0;
    $bitsSet = 0;

    for ($i = 30; $i >= 0; $i--) {
        if (($num1 >> $i) & 1) { // Check if the i-th bit of num1 is set
            if ($bitsSet < $targetBits) {
                $x |= (1 << $i); // Set the i-th bit of x
                $bitsSet++;
            }
        }
    }

    // If we haven't reached targetBits, add remaining bits from LSB
    for ($i = 0; $i < 31 && $bitsSet < $targetBits; $i++) {
        if (!($x & (1 << $i))) { //check if bit is not set yet
            $x |= (1 << $i);
            $bitsSet++;
        }
    }

    return $x;
}

function countSetBits(int $n): int {
    $count = 0;
    while ($n > 0) {
        $count += $n & 1;
        $n >>= 1;
    }
    return $count;
}

// Test cases
echo minimizeXor(3, 5) . PHP_EOL; // Output: 3
echo minimizeXor(1, 12) . PHP_EOL; // Output: 3
echo minimizeXor(10, 7) . PHP_EOL; //Output: 11
?></code>
Copier après la connexion

Complexité temporelle et spatiale :

  • Complexité temporelle : O(log N), où N est la valeur maximale de num1 et num2. C'est parce que nous parcourons les bits des nombres.
  • Complexité spatiale : O(1), un espace supplémentaire constant est utilisé.

Cette solution améliorée offre un moyen plus clair, plus efficace et plus robuste de résoudre le problème. Les commentaires expliquent la logique à chaque étape.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal