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

C++ में तीन समान भाग

मान लीजिए कि हमारे पास 0s और 1s की एक सरणी A है, हमें सरणी को 3 गैर-रिक्त भागों में विभाजित करना होगा जैसे कि ये सभी भाग समान बाइनरी मान का प्रतिनिधित्व करते हैं। यदि यह संभव है, तो किसी भी [i, j] को i+1

  • A[0], A[1], ..., A[i] पहला भाग है;

  • A[i+1], A[i+2], ..., A[j-1] दूसरा भाग है, और

  • A[j], A[j+1], ..., A[A.length - 1] तीसरा भाग है।

तीनों भागों का बाइनरी मान समान है। अगर यह संभव नहीं है, तो [-1, -1] वापस आएं।

इसलिए, यदि इनपुट [0,1,0,1,1] जैसा है, तो आउटपुट [0,4]

होगा

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

  • फ़ंक्शन को परिभाषित करें getIdx(), यह एक सरणी लेगा a, बाएँ, दाएँ,

  • जबकि (बाएं <दाएं और एक [बाएं] 0 के समान है), करें -

    • (बाएं 1 से बढ़ाएं)

  • जबकि दाएं <(int)a.size(), करते हैं -

    • अगर एक [बाएं] एक [दाएं] के बराबर नहीं है, तो, वापसी -1

    • (बाएं से 1 बढ़ाएं), (1 से दाएं बढ़ाएं)

  • बाएं लौटें - 1

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

  • आकार 2 के एक सरणी को परिभाषित करें इसे -1 से भरें

  • संख्या:=0, n:=A का आकार

  • इनिशियलाइज़ i:=0 के लिए, जब i

    • num :=num + 1 जब (A[i] 1 के समान हो, अन्यथा 0

  • अगर num mod 3 0 के बराबर नहीं है, तो -

    • वापसी रिट

  • यदि संख्या 0 के समान है, तो -

    • वापसी { 0, 2 }

  • अनुरोध :=संख्या / 3

  • आईडीएक्स :=n - 1

  • प्रारंभिक अस्थायी के लिए:=0, जब idx> =0 और अस्थायी

    • अस्थायी:=अस्थायी + 1 जब (ए [आईडीएक्स] 1 के समान है), अन्यथा 0

  • (आईडीएक्स को 1 से बढ़ाएं)

  • फर्स्टएंड :=getIdx(A, 0, idx)

  • अगर पहलेअंत <0, तो -

    • वापसी रिट

  • सेकेंडएंड :=getIdx(A, firstEnd + 1, idx)

  • अगर सेकेंडएंड <0, तो -

    • वापसी रिट

  • वापसी {फर्स्टएंड, सेकेंडएंड + 1}

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> threeEqualParts(vector<int>& A){
      vector<int> ret(2, -1);
      int num = 0;
      int n = A.size();
      for (int i = 0; i < n; i++) {
         num += (A[i] == 1);
      }
      if (num % 3 != 0)
         return ret;
      if (num == 0) {
         return { 0, 2 };
      }
      int req = num / 3;
      int idx = n - 1;
      for (int temp = 0; idx >= 0 && temp < req; idx--) {
         temp += A[idx] == 1;
      }
      idx++;
      int firstEnd = getIdx(A, 0, idx);
      if (firstEnd < 0)
         return ret;
      int secondEnd = getIdx(A, firstEnd + 1, idx);
      if (secondEnd < 0)
         return ret;
      return { firstEnd, secondEnd + 1 };
   }
   int getIdx(vector<int>& a, int left, int right){
      while (left < right && a[left] == 0)
      left++;
      while (right < (int)a.size()) {
         if (a[left] != a[right])
            return -1;
         left++;
         right++;
      }
      return left - 1;
   }
};
main(){
   Solution ob;
   vector<int> v = {0,1,0,1,1};
   print_vector(ob.threeEqualParts(v));
}

इनपुट

{0,1,0,1,1}

आउटपुट

[1, 4, ]

  1. C++ प्रोग्राम में एक स्ट्रिंग को N बराबर भागों में विभाजित करें

    इस ट्यूटोरियल में, हम एक प्रोग्राम लिखने जा रहे हैं जो दिए गए स्ट्रिंग को N बराबर भागों में विभाजित करता है। यदि हम स्ट्रिंग को N बराबर भागों में विभाजित नहीं कर सकते हैं, तो उसी चीज़ को प्रिंट करें। आइए समस्या को हल करने के लिए चरणों को देखें। स्ट्रिंग को इनिशियलाइज़ करें और N. आकार . का उपय

  1. सी ++ में समान योग और एक्सओआर

    इस समस्या में, हमें एक पूर्णांक n दिया गया है। हमारा कार्य i =0 से n तक पूर्णांकों की संख्या ज्ञात करने के लिए एक प्रोग्राम बनाना है, जहाँ योग XOR के बराबर है अर्थात (n+i) =(n^i)। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट: एन =4 आउटपुट: 4 स्पष्टीकरण: 0 से n तक के सभी मानों को ध्यान में

  1. C++ में समान वृक्ष विभाजन

    मान लीजिए कि हमारे पास n नोड्स के साथ एक बाइनरी ट्री है, तो हमारा काम यह जांचना है कि क्या ट्री को दो पेड़ों में विभाजित करना संभव है, जिनका मूल पेड़ के ठीक एक किनारे को हटाने के बाद बराबर योग है। तो, अगर इनपुट पसंद है तब आउटपुट सही होगा। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक