C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の配列内の2つの数値の最大XOR


空でない数値の配列a0、a1、a2、…、an-1があるとします。ここで、0≤ai<231です。aiの最大の結果を見つける必要があります。 XOR aj、ここで0≤i、j

これを解決するには、次の手順に従います-

  • insertNode()を定義します。これにはvalとheadが必要です

  • curr:=ヘッド

  • 31から0の範囲のiの場合

    • ビット:=val /(2 ^ i)AND 1

    • currのchild[bit]がnullの場合、currのchild [bit]:=new node

    • curr:=currの子[ビット]

  • find()メソッドを定義します。これは、入力としてvalとheadを取ります

  • curr:=ヘッド、ans:=0

  • 31から0の範囲のiの場合

    • ビット:=val /(2 ^ i)AND 1

    • currのchild[bit]がnullの場合、ans:=ans OR(2 ^ 1)/ p>

    • curr:=currの子[ビット]

  • ansを返す

  • メインの方法から、次のようにします-

  • ans:=0

  • n:=numsのサイズ

  • ヘッド:=新しいノード

  • 0からn– 1の範囲のiの場合、insertNode(nums [i]、head)

  • 0からn– 1の範囲のiの場合、ans:=ansの最大値と検索(nums [i]、head)

  • ansを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
struct Node{
   Node* child[2];
   Node(){
      child[1] = child[0] = NULL;
   }
};
class Solution {
   public:
   void insertNode(int val, Node* head){
      Node* curr = head;
      for(int i = 31; i>= 0; i--){
         int bit = (val >> i) & 1;
         if(!curr->child[bit]){
            curr->child[bit] = new Node();
         }
         curr = curr->child[bit];
      }
   }
   int find(int val, Node* head){
      Node* curr = head;
      int ans = 0;
      for(int i = 31; i>= 0; i--){
         int bit = (val >> i) & 1;
         if(curr->child[!bit]){
            ans |= (1 << i);
            curr = curr->child[!bit];
         } else {
            curr = curr->child[bit];
         }
      }
      return ans;
   }
   int findMaximumXOR(vector<int>& nums) {
      int ans = 0;
      int n = nums.size();
      Node* head = new Node();
      for(int i = 0; i < n; i++){
         insertNode(nums[i], head);
      }
      for(int i = 0; i < n; i++){
         ans = max(ans, find(nums[i], head));
      }
      return ans;
   }
};
main(){
   vector<int> v = {3,10,5,25,2,8};
   Solution ob;
   cout << (ob.findMaximumXOR(v));
}
入力
[3,10,5,25,2,8]

出力

28

  1. 2つ以上(または配列)の数値のGCD0のC++プログラム?

    ここでは、3つ以上の数値の公約数を取得する方法を説明します。 2つの数値の公約数を見つけるのは簡単です。 3つ以上の数値のgcdを見つけたい場合は、gcdの結合法則に従う必要があります。たとえば、{w、x、y、z}のgcdを検索する場合は、{gcd(w、x)、y、z}、次に{gcd(gcd(w、x)、y)になります。 、z}、最後に{gcd(gcd(gcd(w、x)、y)、z)}。アレイを使用すると、非常に簡単に実行できます。 アルゴリズム gcd(a、b) begin    if a is 0, then       return b &n

  2. 2つの数値を交換するC++プログラム

    2つの数値を交換するプログラムを作成する方法は2つあります。 1つは一時変数を使用することを含み、2番目の方法は3番目の変数を使用しません。これらは次のように詳細に説明されています- 一時変数を使用して2つの数値を交換するプログラム 一時変数を使用して2つの数値を交換するプログラムは次のとおりです。 例 #include <iostream > using namespace std; int main() {    int a = 10, b = 5, temp;    temp = a;    a = b; &nbs