Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में एक सरणी में अधिकतम दो संख्याओं का XOR


मान लीजिए कि हमारे पास संख्याओं का एक गैर-रिक्त सरणी है, a0, a1, a2,… , an-1, जहां 0 ≤ ai <231. हमें ai का अधिकतम परिणाम ज्ञात करना है एक्सओआर एजे, जहां 0 आई, जे <एन। तो अगर इनपुट [3,10,5,15,2,8] जैसा है, तो आउटपुट 28 होगा। अधिकतम परिणाम 5 XOR 25 =28 होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • इंसर्टनोड () को परिभाषित करें, यह वैल और हेड लेगा

  • वक्र:=सिर

  • मेरे लिए 31 से 0 की सीमा में

    • बिट:=वैल / (2^i) और 1

    • अगर बच्चे [बिट] का कर्व शून्य है, तो बच्चे का [बिट] करंट:=नया नोड

    • curr :=बच्चे [बिट] करी के

  • खोज () विधि को परिभाषित करें। यह इनपुट के रूप में वैल और हेड लेगा

  • curr :=head, ans :=0

  • मेरे लिए 31 से 0 की सीमा में

    • बिट:=वैल / (2^i) और 1

    • यदि बच्चे [बिट] का कर्व शून्य है, तो उत्तर :=उत्तर या (2^1)/p>

    • curr :=बच्चे [बिट] करी के

  • वापसी उत्तर

  • मुख्य विधि से, निम्न कार्य करें -

  • उत्तर :=0

  • n :=अंकों का आकार

  • सिर :=नया नोड

  • मैं के लिए 0 से n -1 की सीमा में, insertNode(nums[i], head)

  • मैं के लिए 0 से n - 1 की सीमा में, उत्तर:=अधिकतम उत्तर और खोजें (अंक [i], शीर्ष)

  • वापसी उत्तर

उदाहरण (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. दो से अधिक (या सरणी) संख्याओं के GCD के लिए C++ प्रोग्राम?

    दो संख्याओं का सार्व भाजक वे संख्याएँ होती हैं जो उन दोनों की भाजक होती हैं। उदाहरण के लिए, 12 के भाजक 1, 2, 3, 4, 6, 12 हैं। 18 के भाजक 1, 2, 3, 6, 9, 18 हैं। इस प्रकार, 12 और 18 के उभयनिष्ठ भाजक 1, 2 हैं। , 3, 6। इनमें से सबसे बड़ा, शायद आश्चर्यजनक रूप से, 12 और 18 का कहा जाता है। दो पूर्णांकों a

  1. दो से अधिक (या सरणी) संख्याओं के जीसीडी 0 के लिए सी++ प्रोग्राम?

    यहाँ हम देखेंगे कि कैसे हम दो से अधिक संख्याओं की gcd प्राप्त कर सकते हैं। दो संख्याओं का gcd खोजना आसान है। जब हम दो से अधिक संख्याओं का gcd ज्ञात करना चाहते हैं, तो हमें gcd के साहचर्यता नियम का पालन करना होगा। उदाहरण के लिए, यदि हम {w, x, y, z} का gcd खोजना चाहते हैं, तो यह {gcd(w,x), y, z} होगा,

  1. C++ प्रोग्राम दो नंबर स्वैप करने के लिए

    दो नंबरों को स्वैप करने के लिए प्रोग्राम बनाने के दो तरीके हैं। एक में एक अस्थायी चर का उपयोग करना शामिल है और दूसरा तरीका तीसरे चर का उपयोग नहीं करता है। इन्हें विस्तार से इस प्रकार समझाया गया है - अस्थायी चर का उपयोग करके दो नंबरों को स्वैप करने का कार्यक्रम एक अस्थायी चर का उपयोग करके दो नंबरों