#include <vector>
#include <iostream>
using namespace std;
/*
Given two 1d vectors, implement an iterator to return their elements alternately.
For example, given two 1d vectors:
v1 = [1, 2]
v2 = [3, 4, 5, 6]
return [1, 3, 2, 4, 5, 6]
*/
class ZigzagIterator {
private:
int index;
vector<int> zigzagOrder;
public ZigzagIterator(vector<int>& v1, vector<int>& v2) {
int i = 0, j = 0;
bool turn = true;
while(i < v1.size() && j < v2.size()) {
if(turn) {
zigzagOrder.push_back(v1[i++]);
} else {
zigzagOrder.push_back(v2[j++]);
}
turn = !turn;
}
while(i < v1.size()) {
zigzagOrder.push_back(v1[i++]);
}
while(j < v2.size()) {
zigzagOrder.push_back(v2[j++]);
}
}
bool hasNext() {
return index < zigzagOrder.size();
}
int next() {
return zigzagOrder[index++];
}
Follow Up: What if you are given k
1d vectors? How well can your code be extended to such cases?
The "Zigzag" order is not clearly defined and is ambiguous for k > 2
cases. If "Zigzag" does not look right to you, replace "Zigzag" with "Cyclic". For example, given the following input:
[1,2,3]
[4,5,6,7]
[8,9]
It should return
[1,4,8,2,5,9,3,6,7]
.
This follow up can be easily solved using deque structure.
vector<int> zigzagOrder;
int index;
// k vectors
struct iteraterStartAndEnd {
vector<int>::iterator begin;
vector<int>::iterator end;
}
public zigzagIterator(vector< vector<int> >& nums) {
deque<iteraterStartAndEnd> iterators;
for(int i = 0; i < nums.size(); ++i) {
iteraterStartAndEnd tmp;
tmp.begin = nums[i].begin();
tmp.end = nums[i].end();
iterators.push_back(tmp);
}
while(!iterators.empty()) {
auto tmp = iterators.front();
if(tmp.begin != tmp.end()) {
zigzagOrder.push_back(*(tmp.begin));
}
iterators.pop_front();
tmp.begin++;
if(tmp.begin != tmp.end) {
iterators.push_back(tmp);
}
}
}