[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 vectorsv1
andv2
.boolean hasNext()
returnstrue
if the iterator still has elements, andfalse
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 */