问题描述:
Implement an iterator to flatten a 2d vector.
Example:
Input: 2d vector = [ [1,2], [3], [4,5,6] ] Output:[1,2,3,4,5,6]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be:[1,2,3,4,5,6]
.
Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.
解题思路:
没看到啊follow up之前:
因为是两个数组嵌套,可以便利数组内的所有的元素,然后加入队列中。
每次取出队首并弹出。
只使用iterator来解答:
因为参数为引用传参,所以我们就可以直接存储传入数组的iterator。
注意在对内部数组的iterator进行赋值的时候,我们需要检查外部iterator是否有效。
而且初始化时,需要将内部iterator置于一个有效的位置。
每次调用next后,也需要将iterator更新至一个有效位置
代码:
class Vector2D { public: Vector2D(vector<vector<int>>& vec2d) { for(auto v : vec2d){ for(auto n : v){ q.push(n); } } } int next() { int ret = q.front(); q.pop(); return ret; } bool hasNext() { return !q.empty(); } private: queue<int> q; }; /** * Your Vector2D object will be instantiated and called as such: * Vector2D i(vec2d); * while (i.hasNext()) cout << i.next(); */
使用iter:
class Vector2D { public: Vector2D(vector<vector<int>>& vec2d) { //local_v = vec2d; m_iter = vec2d.begin(); m_end = vec2d.end(); if(m_iter != m_end){ sub_iter = (*m_iter).begin(); while(sub_iter == (*m_iter).end()){ m_iter++; if(m_iter != m_end) sub_iter = (*m_iter).begin(); else break; } } } int next() { int ret; ret = *sub_iter; sub_iter++; while(sub_iter == (*m_iter).end()){ m_iter++; if(m_iter != m_end) sub_iter = (*m_iter).begin(); else break; } return ret; } bool hasNext() { if(m_iter == m_end) return false; return true; } private: vector<vector<int>>::iterator m_iter, m_end; vector<int>::iterator sub_iter; //vector<vector<int>> local_v; }; /** * Your Vector2D object will be instantiated and called as such: * Vector2D i(vec2d); * while (i.hasNext()) cout << i.next(); */