标签:
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:
x
and y
.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?hasNext()
. Which is more complex?Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.
解法一:without iterator
public class Vector2D implements Iterator<Integer> { int indexList; int indexEle; List<List<Integer>> vec; public Vector2D(List<List<Integer>> vec2d) { indexList = 0; indexEle = 0; vec = vec2d; } @Override public Integer next() { hasNext(); return vec.get(indexList).get(indexEle++); } @Override public boolean hasNext() { while(indexList<vec.size()) { if(indexEle<vec.get(indexList).size()) return true; else { indexList++; indexEle=0; } } return false; } } /** * Your Vector2D object will be instantiated and called as such: * Vector2D i = new Vector2D(vec2d); * while (i.hasNext()) v[f()] = i.next(); */
解法二:with iterator
public class Vector2D implements Iterator<Integer> { private Iterator<List<Integer>> i; private Iterator<Integer> j; public Vector2D(List<List<Integer>> vec2d) { i = vec2d.iterator(); } public Integer next() { hasNext(); return j.next(); } public boolean hasNext() { while ((j == null || !j.hasNext()) && i.hasNext()) j = i.next().iterator(); return j != null && j.hasNext(); } } /** * Your Vector2D object will be instantiated and called as such: * Vector2D i = new Vector2D(vec2d); * while (i.hasNext()) v[f()] = i.next(); */
reference:
https://discuss.leetcode.com/topic/20697/7-9-lines-added-java-and-c-o-1-space/2
标签:
原文地址:http://www.cnblogs.com/hygeia/p/5774953.html