[Leetcode] 281. Zigzag Iterator 解题报告

xiaoxiao2021-02-28  150

题目:

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

思路:

我自己开始的实现用了5个变量:1个bool变量表示下一个数是否是在v1中取,还有4个迭代器分别表示v1和v2的当前位置和结束位置。虽然测试可以通过,但是代码非常冗余。后来看到网上用队列的思路,十分巧妙,这里顺便实现以下。

代码:

class ZigzagIterator { public: ZigzagIterator(vector<int>& v1, vector<int>& v2) { if (v1.size() > 0) { q.push(make_pair(v1.begin(), v1.end())); } if (v2.size() > 0) { q.push(make_pair(v2.begin(), v2.end())); } } int next() { int ret = *q.front().first; auto it1 = q.front().first, it2 = q.front().second; if (it1 + 1 != it2) { q.push(make_pair(it1 + 1, it2)); } q.pop(); return ret; } bool hasNext() { return !q.empty(); } private: queue<pair<vector<int>::iterator, vector<int>::iterator>> q; }; /** * Your ZigzagIterator object will be instantiated and called as such: * ZigzagIterator i(v1, v2); * while (i.hasNext()) cout << i.next(); */

转载请注明原文地址: https://www.6miu.com/read-28248.html

最新回复(0)