题目描述:
给出两个一维的向量,请你实现一个迭代器,交替返回它们中间的元素。
示例:
输入:
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].
方法1:
主要思路:
(1)直接扩展到 k 个数组的锯齿形迭代器;
class ZigzagIterator {
public:
int nums;
int row;
int col;
vector<vector<int>> vecs;
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
//将数组压入
vecs.push_back(v1);
vecs.push_back(v2);
nums=v1.size()+v2.size();//总的元素的数量
//找出初始的有效的位置
for(int i=0;i<vecs.size();++i){
if(vecs[i].size()){
row=i;
break;
}
}
// row=0;
col=0;
}
int next() {
if(nums==0){
return -1;
}
--nums;
//返回最后一个结点
if(nums==0){
return vecs[row][col];
}
//当前要返回的有效的元素
int res=vecs[row][col];
//将位置调整到下一个有效元素的位置
//调整行
++row;
if(row==vecs.size()){
row=0;
++col;
}
//调整可能的列
while(row<vecs.size()&&col>=vecs[row].size()){
++row;
if(row==vecs.size()){
row=0;
++col;
}
}
return res;
}
bool hasNext() {
return nums!=0;//返回是否有剩余的结点
}
};
/**
* Your ZigzagIterator object will be instantiated and called as such:
* ZigzagIterator i(v1, v2);
* while (i.hasNext()) cout << i.next();
*/