251. Flatten 2D Vector
Difficulty: Medium
Topics: Design
Similar Questions:
Problem:
Design and implement an iterator to flatten a 2d vector. It should support the following operations: next
and hasNext
.
Example:
Vector2D iterator = new Vector2D([[1,2],[3],[4]]); iterator.next(); // return 1 iterator.next(); // return 2 iterator.next(); // return 3 iterator.hasNext(); // return true iterator.hasNext(); // return true iterator.next(); // return 4 iterator.hasNext(); // return false
Notes:
- Please remember to RESET your class variables declared in Vector2D, as static/class variables are persisted across multiple test cases. Please see here for more details.
- You may assume that
next()
call will always be valid, that is, there will be at least a next element in the 2d vector whennext()
is called.
Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.
Solutions:
class Vector2D {
public:
Vector2D(vector<vector<int>>& v) {
this->v = v;
i = 0;
j = 0;
}
int next() {
hasNext();
int val = v[i][j];
step();
return val;
}
bool hasNext() {
while (i < v.size() && !valid()) { // two conditions!
step();
}
return i < v.size();
}
bool valid() {
return i < v.size() && j < v[i].size();
}
void step() {
if (++j >= v[i].size()) {
++i;
j = 0;
}
}
private:
vector<vector<int>> v;
int i;
int j;
};
/**
* Your Vector2D object will be instantiated and called as such:
* Vector2D* obj = new Vector2D(v);
* int param_1 = obj->next();
* bool param_2 = obj->hasNext();
*/