[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 vectorsv1andv2.boolean hasNext()returnstrueif the iterator still has elements, andfalseotherwise.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 <= 10001 <= 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 */

浙公网安备 33010602011771号