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 :
num1
= 3, num2
= 5Exemple 2 :
num1
= 1, num2
= 12Contraintes :
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
.
Compter les bits définis : Déterminez le nombre de bits définis dans num2
. Appelons cela targetBits
.
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.
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>
Complexité temporelle et spatiale :
num1
et num2
. C'est parce que nous parcourons les bits des nombres.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!