समस्या विवरण
मान लीजिए दो 1D सरणियां हैं, हमें एक इटरेटर लागू करना है जो उनके तत्वों को बारी-बारी से लौटाएगा। दो विधियां होंगी:
- next() - अगला तत्व प्राप्त करने के लिए
- hasNext() - जांचने के लिए कि अगला तत्व मौजूद है या नहीं
उदाहरण के लिए, यदि इनपुट v1 = [1,2], v2 = [3,4,5,6] है, तो आउटपुट [1,3,2,4,5,6] होगा।
समाधान दृष्टिकोण
कतार का उपयोग करके दो सरणियों के सूचकांकों को ट्रैक करें:
- पेयर्स की कतार q परिभाषित करें
- इनिशियलाइज़र दो सरणियों v1 और v2 लेता है:
- यदि v1 का आकार > 0, तो {0, 0} को q में डालें
- यदि v2 का आकार > 0, तो {0, 1} को q में डालें
- next() फ़ंक्शन:
- temp := q का पहला तत्व, q से हटाएं
- ret := 0
- यदि temp.second == 1:
- ret := v2[temp.first]
- temp.first बढ़ाएं
- यदि temp.first < v2 का आकार, तो temp को q में डालें
- अन्यथा:
- ret := v1[temp.first]
- temp.first बढ़ाएं
- यदि temp.first < v1 का आकार, तो temp को q में डालें
- ret लौटाएं
- hasNext() फ़ंक्शन:
- true लौटाएं जब q खाली न हो
C++ कार्यान्वयन
#include <bits/stdc++.h>
using namespace std;
class ZigzagIterator {
public:
queue <pair<int, int>> q;
vector <int> v1, v2;
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
this->v1 = v1;
this->v2 = v2;
if (v1.size()) {
q.push({ 0, 0 });
}
if (v2.size()) {
q.push({ 0, 1 });
}
}
int next() {
pair<int, int> temp;
temp = q.front();
q.pop();
int ret = 0;
if (temp.second == 1) {
ret = v2[temp.first];
temp.first++;
if (temp.first < v2.size())
q.push(temp);
}
else {
ret = v1[temp.first];
temp.first++;
if (temp.first < v1.size())
q.push(temp);
}
return ret;
}
bool hasNext() {
return !q.empty();
}
};
int main(){
vector<int> v1 = {1,3,5,7}, v2 = {2,4,6,8,10,12,17};
ZigzagIterator ob(v1, v2);
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext() ? "True" : "False") << endl;
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext() ? "True" : "False") << endl;
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext() ? "True" : "False") << endl;
return 0;
}
इनपुट
{1,3,5,7},{2,4,6,8,10,12,17}
आउटपुट
1 2 True 3 4 5 True 6 7 8 10 True 12 17 False