zoukankan      html  css  js  c++  java
  • 251. Flatten 2D Vector

    问题描述:

    Implement an iterator to flatten a 2d vector.

    Example:

    Input: 2d vector =
    [
      [1,2],
      [3],
      [4,5,6]
    ]
    Output: [1,2,3,4,5,6]
    Explanation: By calling next repeatedly until hasNext returns false, 
                 the order of elements returned by next should be: [1,2,3,4,5,6].

    Follow up:
    As an added challenge, try to code it using only iterators in C++ or iterators in Java.

    解题思路:

    没看到啊follow up之前:

    因为是两个数组嵌套,可以便利数组内的所有的元素,然后加入队列中。

    每次取出队首并弹出。

    只使用iterator来解答:

    因为参数为引用传参,所以我们就可以直接存储传入数组的iterator。

    注意在对内部数组的iterator进行赋值的时候,我们需要检查外部iterator是否有效。

    而且初始化时,需要将内部iterator置于一个有效的位置。

    每次调用next后,也需要将iterator更新至一个有效位置

    代码:

    class Vector2D {
    public:
        Vector2D(vector<vector<int>>& vec2d) {
            for(auto v : vec2d){
                for(auto n : v){
                    q.push(n);
                }
            }    
        }
    
        int next() {
            int ret = q.front();
            q.pop();
            return ret;
        }
    
        bool hasNext() {
            return !q.empty();
        }
    private:
        queue<int> q;
    };
    
    /**
     * Your Vector2D object will be instantiated and called as such:
     * Vector2D i(vec2d);
     * while (i.hasNext()) cout << i.next();
     */

    使用iter:

    class Vector2D {
    public:
        Vector2D(vector<vector<int>>& vec2d) {
            //local_v = vec2d;
            m_iter = vec2d.begin();
            m_end = vec2d.end();
            if(m_iter != m_end){
                sub_iter = (*m_iter).begin();
                while(sub_iter == (*m_iter).end()){
                    m_iter++;
                    if(m_iter != m_end)
                        sub_iter = (*m_iter).begin();
                    else break;
                }
            }
        }
    
        int next() {
            int ret;
            ret = *sub_iter;
            sub_iter++;
            while(sub_iter == (*m_iter).end()){
                m_iter++;
                if(m_iter != m_end) sub_iter = (*m_iter).begin();
                else break;
            }
            
            return ret;
        }
    
        bool hasNext() {
            
            if(m_iter == m_end) return false;
            return true;
        }
    private:
        vector<vector<int>>::iterator m_iter, m_end;
        vector<int>::iterator sub_iter;
        //vector<vector<int>> local_v;
    };
    
    /**
     * Your Vector2D object will be instantiated and called as such:
     * Vector2D i(vec2d);
     * while (i.hasNext()) cout << i.next();
     */
  • 相关阅读:
    【371】Twitter 分类相关
    【370】Python列表生成式(for 写入一行)
    Netbeans 中的编译器相关配置
    SP*
    du 命令
    闲杂
    Shell重定向&>file、2>&1、1>&2的区别
    Shell编程中Shift的用法
    shell中一维数组值得获取
    shell expr的用法
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9425213.html
Copyright © 2011-2022 走看看