समस्या विवरण
मान लीजिए हमारे पास एक 2D वेक्टर है, हमें उस 2D वेक्टर को फ्लैट करने के लिए एक इटरेटर डिजाइन और कार्यान्वित करना है। अलग-अलग विधियां होंगी:
- next() - वर्तमान तत्व का अगला तत्व लौटाएगा
- hasNext() - जांचेगा कि अगला तत्व मौजूद है या नहीं
उदाहरण के लिए, यदि इनपुट [[1,2],[3],[4]] है तो यदि हम फ़ंक्शंस को इस तरह कॉल करते हैं:
- iterator.next();
- iterator.next();
- iterator.next();
- iterator.hasNext();
- iterator.hasNext();
- iterator.next();
- iterator.hasNext();
तो आउटपुट [1,2,3,true, true,4,false] होगा।
समाधान दृष्टिकोण
दो पॉइंटर्स (पंक्ति और स्तंभ) का उपयोग करके 2D वेक्टर ट्रैवर्स करें:
- एक 2D सरणी v परिभाषित करें
- इनिशियलाइज़र 2D सरणी v लेता है:
- rowPointer := 0, colPointer := 0
- n := v का आकार
- जब तक (rowPointer < n और colPointer >= v[rowPointer] का आकार): rowPointer++
- next() फ़ंक्शन:
- x := v[rowPointer][colPointer]
- colPointer++
- यदि colPointer == v[rowPointer] का आकार:
- colPointer := 0
- rowPointer++
- जब तक (rowPointer < n और colPointer >= v[rowPointer] का आकार): rowPointer++
- x लौटाएं
- hasNext() फ़ंक्शन:
- गलत लौटाएं जब rowPointer == n
C++ कार्यान्वयन
#include <bits/stdc++.h>
using namespace std;
class Vector2D {
public:
int rowPointer, colPointer;
int n;
vector<vector<int> > v;
Vector2D(vector<vector<int> >& v){
this->v = v;
rowPointer = 0;
colPointer = 0;
n = v.size();
while (rowPointer < n && colPointer >= v[rowPointer].size()){
rowPointer++;
}
}
int next(){
int x = v[rowPointer][colPointer];
colPointer++;
if (colPointer == v[rowPointer].size()) {
colPointer = 0;
rowPointer++;
while (rowPointer < n && colPointer >= v[rowPointer].size()) {
rowPointer++;
}
}
return x;
}
bool hasNext(){
return !(rowPointer == n);
}
};
int main(){
vector<vector<int>> v = {{1,2},{3},{4}};
Vector2D ob(v);
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext());
return 0;
}
इनपुट
ob.next() ob.next() ob.next() ob.hasNext() ob.next() ob.hasNext()
आउटपुट
1 2 3 1 4 0