मान लीजिए कि हमें एक इटरेटर बनाना है जो एक रन-लेंथ एन्कोडेड अनुक्रम के माध्यम से पुनरावृत्त हो। यहां इटरेटर को 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