281 锯齿迭代器

题目描述:
给出两个一维的向量,请你实现一个迭代器,交替返回它们中间的元素。

示例:
输入:
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();
 */

你可能感兴趣的:(LeetCode)