Zigzag Iterator

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?

Clarification for the follow up question - Update (2015-09-18): The "Zigzag" order is not clearly defined and is ambiguous for k > 2 cases. If "Zigzag" does not look right to you, replace "Zigzag" with "Cyclic". For example, given the following input:

[1,2,3]
[4,5,6,7]
[8,9]

It should return [1,4,8,2,5,9,3,6,7].

 1 public class ZigzagIterator {
 2     
 3     List<Iterator<Integer>> iters = new ArrayList<>();
 4     int count = 0;
 5 
 6     public ZigzagIterator(List<List<Integer>> lists) {
 7         for (List<Integer> v : lists) {
 8             if (!v.isEmpty()) iters.add(v.iterator());
 9         }
10     }
11 
12     public int next() {
13         int x = iters.get(count).next();
14         if (!iters.get(count).hasNext())
15             iters.remove(count);
16         else
17             count++;
18 
19         if (iters.size() != 0)
20             count %= iters.size();
21         return x;
22     }
23 
24     public boolean hasNext() {
25         return !iters.isEmpty();
26     }
27 }
28 
29 /**
30  * Your ZigzagIterator object will be instantiated and called as such:
31  * ZigzagIterator i = new ZigzagIterator(v1, v2); while (i.hasNext()) v[f()] =
32  * i.next();
33  */

 

posted @ 2016-08-06 06:14  北叶青藤  阅读(247)  评论(0编辑  收藏  举报