• 281. Zigzag Iterator


    最后更新

    二刷
    11-Jan-2017

    第一种方式是各种pointer标记轮到哪个LIST,在那个LIST是什么index,比较繁琐。

    第二种方式是用Queue < List < Integer > >,每次拿出最前面的list,拿出里面的element,然后如果此时list不是空的,从屁眼塞回原来的Queue里。

    Time Complexity:
    init: O(1)
    hasNext: O(1)
    next(): O(1)

    Space: O(n)

    public class ZigzagIterator {
        
        Queue<List<Integer>> q = new LinkedList<>();
        public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
            if (!v1.isEmpty()) {
                q.add(v1);
            }
            if (!v2.isEmpty()) {
                q.add(v2);
            }
        }
    
        public int next() {
            List<Integer> tempList = q.poll();
            int res = tempList.remove(0);
            if (!tempList.isEmpty()) {
                q.add(tempList);
            }
            return res;
        }
    
        public boolean hasNext() {
            return !q.isEmpty();
        }
    }
    

    follow up: K lists

    没啥变化吧。。按顺序塞屁眼,出来的时候还是这个顺序。


    一刷
    08-Oct-2017

    我是直接按K个来做的,记录总数和已读数量判断hasNext();
    一个INDEX,每次mod K得到哪个LIST,/k得到具体INDEX位置,当然如果INDEX位置超过当前LIST的长度,就看下一个LIST。。

    public class ZigzagIterator 
    {
        int total = 0;
        int cur = 0;
        int have = 0;
        List<Integer> l1;
        List<Integer> l2;
        public ZigzagIterator(List<Integer> v1, List<Integer> v2) 
        {
            total = v1.size() + v2.size();
            length = Math.max(v1.size(),v2.size())*2;
            this.l1 = v1;
            this.l2 = v2;
        }
    
        public int next() 
        {
            have++;
            while(true)
            {
                if(cur % 2 == 0)
                {
                    if(cur/2 < l1.size())
                    {
                        cur++;
                        return l1.get((cur-1)/2);
                    }
                    else cur++;
                }
                else
                {
                    if(cur/2 < l2.size())
                    {
                        cur++;
                        return l2.get((cur-1)/2);
                    }
                    else cur++;
                }
            }
    
        }
    
        public boolean hasNext() 
        {
            return (have < total);
        }
    }
    

    Discussion Board提供了用Queue的思路而不用记录INDEX的方法,其实一开始我想到都添加到一个LIST里面,但是会修改原来的LIST,毕竟要删除掉,否则还要记录每个的INDEX,就没意义了。。

    下面这个QUEUE是不需要记录INDEX的方法 ..

    public class ZigzagIterator 
    {
        Queue<List<Integer>> q = new LinkedList<List<Integer>>();
        public ZigzagIterator(List<Integer> v1, List<Integer> v2) 
        {
            if(!v1.isEmpty())
                q.add(v1);
            if(!v2.isEmpty())
                q.add(v2);
        }
    
        public int next() 
        {
            List<Integer> tempList = q.poll();
            int res = tempList.remove(0);
            if(!tempList.isEmpty()) q.add(tempList);
            return res;
    
        }
    
        public boolean hasNext() 
        {
            return (!q.isEmpty());
        }
    }
    
  • 相关阅读:
    软件测试(理论基础)
    Android NDK常见配置问题的解决方案
    Eclemma各种安装方式以及安装失败解决
    检测Buffer Overflow的几种方法
    转: 跟我一起写 Makefile
    流敏感、路径敏感、上下文敏感
    Symbolic Exectuion with Mixed ConcreteSymbolic Solving
    基于ajc的代码编织
    第一次个人编程作业
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/reboot329/p/5944471.html
Copyright © 2020-2023  润新知