Implement an iterator to flatten a 2d vector.
For example,
Given 2d vector =
[
[1,2],
[3],
[4,5,6]
]
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,2,3,4,5,6].
Hint:
*How many variables do you need to keep track?
*Two variables is all you need. Try with x and y.
*To write correct code, think about the invariant to maintain. What is it?
*The invariant is x and y must always point to a valid point in the 2d vector. Should you maintain your invariant ahead of time or right when you need it?
*Common logic in two different places should be refactored into a common method.
Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.
Hide Company Tags Google Airbnb Zenefits
Hide Tags Design
Hide Similar Problems (M) Binary Search Tree Iterator (M) Zigzag Iterator (M) Peeking Iterator
根据提示:使用两个iterator,一个指向2d vector的begin, 另一个指向2dvector的end(即在例子中一个指1另一个指在6的后面) 再利用一个int j来指向具体的column。
class Vector2D {
vector<vector<int>> :: iterator i, iEnd;
int j = 0;
public:
Vector2D(vector<vector<int>>& vec2d) {
i = vec2d.begin();
iEnd = vec2d.end();
}
int next() {
hasNext();
return (*i)[j++];
}
bool hasNext() {
while(i != iEnd && j == (*i).size()){
++i;
j=0;
}
return i!=iEnd;
}
};