Question
Given two 1d vectors, implement an iterator to return their elements alternately.
For example, given two 1d vectors:
v1 = [1, 2] v2 = [3, 4, 5, 6]
By calling next repeatedly until hasNext returns false
, 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?
Solution
This solution is suitable for k vectors.
1 public class ZigzagIterator { 2 private List<Iterator> list; 3 4 public ZigzagIterator(List<Integer> v1, List<Integer> v2) { 5 list = new ArrayList<Iterator>(); 6 if (v1.iterator().hasNext()) 7 list.add(v1.iterator()); 8 if (v2.iterator().hasNext()) 9 list.add(v2.iterator()); 10 } 11 12 public int next() { 13 Iterator<Integer> current = list.remove(0); 14 int result = current.next(); 15 if(current.hasNext()) 16 list.add(current); 17 return result; 18 } 19 20 public boolean hasNext() { 21 return list.size() > 0 ? true : false; 22 } 23 } 24 25 /** 26 * Your ZigzagIterator object will be instantiated and called as such: 27 * ZigzagIterator i = new ZigzagIterator(v1, v2); 28 * while (i.hasNext()) v[f()] = i.next(); 29 */