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

सी++ में आरएलई इटरेटर

मान लीजिए कि हमें एक इटरेटर बनाना है जो एक रन-लेंथ एन्कोडेड अनुक्रम के माध्यम से पुनरावृत्त हो। यहां इटरेटर को RLEIterator (int [] A) को कॉल करके प्रारंभ किया गया है, जहां ए अनुक्रम की रन-लम्बाई एन्कोडिंग है। तो हम कह सकते हैं कि सभी के लिए भी, ए[i] हमें बताता है कि अनुक्रम में गैर-ऋणात्मक पूर्णांक मान A[i+1] कितनी बार दोहराया जाता है। यहां इटरेटर एक फ़ंक्शन का समर्थन करता है -

  • अगला (int n):यह फ़ंक्शन अगले n तत्वों (n> =1) को समाप्त कर देता है और इस तरह से समाप्त हो गया अंतिम तत्व लौटाता है। इसलिए यदि निकास के लिए कोई तत्व नहीं बचा है, तो इसके बजाय अगला -1 लौटाता है।

मान लीजिए कि हम ए =[3,8,0,9,2,5] से शुरू करते हैं, जो अनुक्रम [8,8,8,5,5] का एक रन-लेंथ एन्कोडिंग है। यह किया जाता है क्योंकि अनुक्रम को "तीन आठ, शून्य नौ, दो पांच" के रूप में पढ़ा जा सकता है। तो उन्हें ए के साथ शुरू करने के बाद, अगर हम अगला (2), अगला (1), अगला (1), अगला (2) कहते हैं, तो अंतिम परिणाम [8, 8, 5, -1] होगा।

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

  • इनिशियलाइज़र में, एरे को ए के रूप में इनिशियलाइज़ करें, और इंडेक्स सेट करें:=0

  • अगली () विधि में यह इनपुट के रूप में n लेता है। यह इस प्रकार काम करेगा

  • जबकि इंडेक्स <ए और एन का आकार> ए [इंडेक्स]

    • n :=n - A[index], और इंडेक्स को 2 से बढ़ाएं

  • यदि अनुक्रमणिका> सरणी A का आकार है, तो -1 लौटाएं

  • ए [इंडेक्स]:=ए [इंडेक्स] - एन

  • वापसी ए[इंडेक्स + 1]

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class RLEIterator {
   public:
   vector <int> A;
   int idx = 0;
   RLEIterator(vector<int>& A) {
      this->A = A;
      idx = 0;
   }
   int next(int n) {
      while(idx < A.size() && n > A[idx]){
         n -= A[idx];
         idx += 2;
      }
      if(idx >= A.size()) return -1;
      A[idx] = A[idx] - n;
      return A[idx + 1];
   }
};
main(){
   vector<int> v = {3,8,0,9,2,5};
   RLEIterator ob(v);
   cout << (ob.next(2)) << endl;
   cout << (ob.next(1)) << endl;
   cout << (ob.next(1)) << endl;
   cout << (ob.next(2)) << endl;
}

इनपुट

Initialize with [3,8,0,9,2,5] and call next(2), next(1), next(1), next(2)

आउटपुट

8
8
5
-1

  1. C++ में बाइनरी सर्च ट्री इटरेटर

    मान लीजिए हम बाइनरी ट्री के लिए एक इटरेटर बनाना चाहते हैं। दो तरीके होंगे। अगला () विधि अगले तत्व को वापस करने के लिए है, और hasNext () विधि बूलियन मान वापस करने के लिए है, जो इंगित करेगा कि अगला तत्व मौजूद है या नहीं। तो अगर पेड़ जैसा है - और फ़ंक्शन कॉल का क्रम [अगला (), अगला (), है नेक्स्ट (),

  1. सी ++ में इटरेटर अमान्यता

    सी ++ में, हमारे पास वेक्टर, सूची, सेट, मानचित्र इत्यादि जैसे विभिन्न कंटेनर हैं। इन कंटेनरों के माध्यम से पुनरावृत्त करने के लिए, हम इटरेटर्स का उपयोग कर सकते हैं। जब हम C++ में इटरेटर का उपयोग कर रहे हों तो हमें सावधान रहना चाहिए। जब ​​हम किसी कंटेनर पर पुनरावृत्ति का उपयोग कर रहे हैं, तो कभी-कभी,

  1. सी ++ में लेक्सिकोग्राफिक रूप से अगला क्रमपरिवर्तन

    यहां हम देखेंगे कि सी ++ में एक स्ट्रिंग के लेक्सिकोग्राफिक रूप से अगले क्रमपरिवर्तन को कैसे उत्पन्न किया जाए। लेक्सिकोग्राफिक रूप से अगला क्रमपरिवर्तन मूल रूप से अधिक से अधिक क्रमपरिवर्तन है। उदाहरण के लिए, ACB का अगला BAC होगा। कुछ मामलों में, लेक्सिकोग्राफ़िक रूप से अगला क्रमपरिवर्तन मौजूद नहीं ह