[LeetCode] 281. Zigzag Iterator

 

Given two vectors of integers v1 and v2, implement an iterator to return their elements alternately.

Implement the ZigzagIterator class:

  • ZigzagIterator(List<int> v1, List<int> v2) initializes the object with the two vectors v1 and v2.
  • boolean hasNext() returns true if the iterator still has elements, and false otherwise.
  • int next() returns the current element of the iterator and moves the iterator to the next element.

Example 1:

Input: v1 = [1,2], v2 = [3,4,5,6]
Output: [1,3,2,4,5,6]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,3,2,4,5,6].

Example 2:

Input: v1 = [1], v2 = []
Output: [1]

Example 3:

Input: v1 = [], v2 = [1]
Output: [1]

Constraints:

  • 0 <= v1.length, v2.length <= 1000
  • 1 <= v1.length + v2.length <= 2000
  • -231 <= v1[i], v2[i] <= 231 - 1

Follow up: What if you are given k vectors? How well can your code be extended to such cases?

Clarification for the follow-up question:

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".

Follow-up Example:

Input: v1 = [1,2,3], v2 = [4,5,6,7], v3 = [8,9]
Output: [1,4,8,2,5,9,3,6,7]

锯齿迭代器。

题意是给两个一维的向量,请交替输出他们的值。

常规思路就是为这两个向量分别创建一个iterator迭代器,然后从两个迭代器里交替输出元素。这里需要一个temp迭代器以用来帮助交换两个迭代器。

 1 public class ZigzagIterator {
 2     private Iterator<Integer> i, j, temp;
 3 
 4     public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
 5         i = v2.iterator();
 6         j = v1.iterator();
 7     }
 8 
 9     public int next() {
10         if (j.hasNext()) {
11             temp = i;
12             i = j;
13             j = temp;
14         }
15         return i.next();
16     }
17 
18     public boolean hasNext() {
19         return i.hasNext() || j.hasNext();
20     }
21 }
22 
23 /**
24  * Your ZigzagIterator object will be instantiated and called as such:
25  * ZigzagIterator i = new ZigzagIterator(v1, v2);
26  * while (i.hasNext()) v[f()] = i.next();
27  */

 

这道题的followup是如果给K个一维的向量怎么处理。很显然如果有K个向量,那么自然还是需要K个迭代器来帮助输出来自于每个向量的元素,但是这里用temp来替换每个迭代器就不管用了。这里正确的思路是用一个queue存储所有的迭代器。每次调用next()函数的时候,就从queue中弹出一个迭代器。如果这个被弹出的迭代器里还有下一个元素,则弹出这个元素,并把这个迭代器再放回queue的末端;如果这个迭代器空了则无需再放回queue。

 1 public class ZigzagIterator {
 2     private Queue<Iterator> queue;
 3 
 4     public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
 5         queue = new LinkedList<>();
 6         if (!v1.isEmpty()) {
 7             queue.offer(v1.iterator());
 8         }
 9         if (!v2.isEmpty()) {
10             queue.offer(v2.iterator());
11         }
12     }
13 
14     public int next() {
15         Iterator cur = queue.poll();
16         Integer res = (Integer) cur.next();
17         if (cur.hasNext()) {
18             queue.offer(cur);
19         }
20         return res;
21     }
22 
23     public boolean hasNext() {
24         return !queue.isEmpty();
25     }
26 }
27 
28 /**
29  * Your ZigzagIterator object will be instantiated and called as such:
30  * ZigzagIterator i = new ZigzagIterator(v1, v2);
31  * while (i.hasNext()) v[f()] = i.next();
32  */

 

LeetCode 题目总结

posted @ 2020-08-26 14:09  CNoodle  阅读(210)  评论(0编辑  收藏  举报