给出两个一维的向量,请你实现一个迭代器,交替返回它们中间的元素。
示例:
输入:
v1 = [1,2]
v2 = [3,4,5,6]
输出: [1,3,2,4,5,6]
解析: 通过连续调用 next 函数直到 hasNext 函数返回 false,
next 函数返回值的次序应依次为: [1,3,2,4,5,6]。
拓展:假如给你 k 个一维向量呢?你的代码在这种情况下的扩展性又会如何呢?
拓展声明:
“锯齿” 顺序对于 k > 2 的情况定义可能会有些歧义。
所以,假如你觉得 “锯齿” 这个表述不妥,也可以认为这是一种 “循环”。
例如:
输入:
[1,2,3]
[4,5,6,7]
[8,9]
输出: [1,4,8,2,5,9,3,6,7].
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zigzag-iterator 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class ZigzagIterator {
map<int, vector<int>> m;
unordered_map<int,int> idx;
int total = 0;
map<int, vector<int>>::iterator it;
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
m[0] = v1;
m[1] = v2;
it = m.begin();
idx[0] = 0;
idx[1] = 0;
total += v1.size()+v2.size();
}
int next() {
if(!hasNext())
return -1;
if(it == m.end())
it = m.begin();//循环
if(idx[it->first] == it->second.size())
{ //该数组指针到结尾了
m.erase(it++);//删除该数组,移动到下一个数组
return next();
}
int val = it->second[idx[it->first]];//答案值
idx[it->first]++;//数组遍历位置+1
it++;//去下一个数组
total--;//总数-1
return val;
}
bool hasNext() {
return total;
}
};
12 ms 8.6 MB