281. Zigzag Iterator
Difficulty: Medium
Topics: Design
Similar Questions:
Problem:
Given two 1d vectors, implement an iterator to return their elements alternately.
Example:
Input: v1 = [1,2] v2 = [3,4,5,6] Output:[1,3,2,4,5,6] Explanation:
By calling next repeatedly until hasNext returnsfalse
, the order of elements returned by next should be:[1,3,2,4,5,6]
.
Follow up: What if you are given k
1d vectors? How well can your code be extended to such cases?
Clarification for the follow up question:
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:
Input:
[1,2,3]
[4,5,6,7]
[8,9]
Output: [1,4,8,2,5,9,3,6,7]
.
Solutions:
class ZigzagIterator {
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
this->v1 = v1;
this->v2 = v2;
}
int next() {
if (pos1 == v1.size()) {
return v2[pos2++];
}
if (pos2 == v2.size()) {
return v1[pos1++];
}
if ((pos1 + pos2) % 2 == 0) {
return v1[pos1++];
} else {
return v2[pos2++];
}
}
bool hasNext() {
return pos1 < v1.size() || pos2 < v2.size();
}
private:
int pos1 = 0;
int pos2 = 0;
vector<int> v1;
vector<int> v2;
};
/**
* Your ZigzagIterator object will be instantiated and called as such:
* ZigzagIterator i(v1, v2);
* while (i.hasNext()) cout << i.next();
*/