lintcode 541 · 左旋右旋迭代器 II 【中等 vip 迭代器 】

题目

https://www.lintcode.com/problem/541

和题目 左旋右旋迭代器 类似,在本题中,你将得到一个列表vecs,其中包括 k 个一维向量。
你的任务是通过 next 函数一个个地返回向量中的元素,按照 vecs[0][0], vecs[1][0]... vecs[k - 1][0], vecs[0][1], vecs[1][1]... vecs[k - 1][1], vecs[0][2], vecs[1][2]... vecs[k - 1][2]... 的顺序进行迭代。


样例
样例1

输入: k = 3
vecs = [
    [1,2,3],
    [4,5,6,7],
    [8,9],
]
输出: [1,4,8,2,5,9,3,6,7]
样例2

输入: k = 3
vecs = [
    [1,1,1]
    [2,2,2]
    [3,3,3]
]
输出: [1,2,3,1,2,3,1,2,3]

思路

记录最后一个长度最大的行maxRow,记录最长行的长度m,当前在r行c列,每一次迭代,
检查r行c列是否有值,没有就下移一行,到最后一行的话,就跳转到第一行r=0,同时
列数c+1,获取有效的数的之后,r,c下移一个。注意判断r,c如果超过了maxRow,m-1的
位置,那就是没有数可以迭代了

答案

public class ZigzagIterator2 {
    
        //n:有多少行,m:最长的行有多少列
        int n = 0, m = 0;

        int r = 0, c=0,maxRow=0;//当前在第r行,第c列,maxCol表示最长的是哪一行
        Integer next = null; //下一个数
        List<List<Integer>> ll = new ArrayList<>();

        public ZigzagIterator2(List<List<Integer>> vecs) {
            ll = vecs;
            n = ll.size();
            //找打最大的列数,以及迭代器的第一个数
            for (int i = 0; i < n; i++) {
                if(ll.get(i).size() >= m){
                    m = ll.get(i).size();
                    maxRow = i;
                }
            }

        }


        public int next() {
            while (true){
                if(r==maxRow && c==m ) break;  //在最长的一行,并且超过最大列的长度
                //检查是否是最后一个
                if(r == maxRow && c == m-1){
                    //System.out.println("是否是最后一个了");
                    next =  ll.get(r).get(c);
                    c++;
                    break;
                }


                if(ll.get(r).size()>c){
                    //System.out.println("  获取值了:r="+r+" c="+c);
                    next = ll.get(r).get(c);
                    r= r+1;
                    if(r ==n){
                        r=0;
                        c+=1;
                    }
                    break;
                }

                r++;
                if(r ==n){
                    r=0;
                    c+=1;
                }
            }

            return next;
        }

        public boolean hasNext() {
            //System.out.println(r+" "+c+" || "+ " macrow:"+maxRow+"  m="+m);
            if(r == maxRow && c<m) return true;
            if(r!=maxRow && c<m) return true;

            return false;
        }
}

/**
 * Your ZigzagIterator2 object will be instantiated and called as such:
 * ZigzagIterator2 solution = new ZigzagIterator2(vecs);
 * while (solution.hasNext()) result.add(solution.next());
 * Output result
 */

本地测试代码

import java.util.*;

public class LC541 {

    static class ZigzagIterator2 {

        //n:有多少行,m:最长的行有多少列
        int n = 0, m = 0;

        int r = 0, c = 0, maxRow = 0;//当前在第r行,第c列,maxCol表示最长的是哪一行
        Integer next = null; //下一个数
        List<List<Integer>> ll = new ArrayList<>();

        public ZigzagIterator2(List<List<Integer>> vecs) {
            ll = vecs;
            n = ll.size();
            //找打最大的列数,以及迭代器的第一个数
            for (int i = 0; i < n; i++) {
                if (ll.get(i).size() >= m) {
                    m = ll.get(i).size();
                    maxRow = i;
                }
            }

        }


        public int next() {
            while (true) {
                if (r == maxRow && c == m) break;  //在最长的一行,并且超过最大列的长度
                //检查是否是最后一个
                if (r == maxRow && c == m - 1) {
                    //System.out.println("是否是最后一个了");
                    next = ll.get(r).get(c);
                    c++;
                    break;
                }


                if (ll.get(r).size() > c) {
                    //System.out.println("  获取值了:r="+r+" c="+c);
                    next = ll.get(r).get(c);
                    r = r + 1;
                    if (r == n) {
                        r = 0;
                        c += 1;
                    }
                    break;
                }

                r++;
                if (r == n) {
                    r = 0;
                    c += 1;
                }
            }

            return next;
        }

        public boolean hasNext() {
            //System.out.println(r+" "+c+" || "+ " macrow:"+maxRow+"  m="+m);
            if (r == maxRow && c < m) return true;
            if (r != maxRow && c < m) return true;

            return false;
        }
    }


    public static void main(String[] args) {
        test1();
    }


    public static void test1() {
        List<List<Integer>> ll1 = new ArrayList<>();
        ll1.add(Arrays.asList(9, 3, 2, 4, 8));
        ll1.add(Arrays.asList(1, 2, 3, 4, 2));
        ZigzagIterator2 solution = new ZigzagIterator2(ll1);

        List<Integer> result = new ArrayList<>();
        while (solution.hasNext()) result.add(solution.next());

        System.out.println(result);
    }
    /*
    输入数据
[[9,3,2,4,8],[1,2,3,4,2]]
输出数据
[9,1,3,2,2,3,4,4,8]
期望答案
[9,1,3,2,2,3,4,4,8,2]
     */

    public static void test2() {
        List<List<Integer>> ll1 = new ArrayList<>();
        ll1.add(Arrays.asList(1, 2, 3));
        ll1.add(Arrays.asList(4, 5, 6, 7));
        ll1.add(Arrays.asList(8, 9));
        ZigzagIterator2 solution = new ZigzagIterator2(ll1);

        List<Integer> result = new ArrayList<>();
        while (solution.hasNext()) result.add(solution.next());

        System.out.println(result);
    }
/**
 * Your ZigzagIterator2 object will be instantiated and called as such:
 * ZigzagIterator2 solution = new ZigzagIterator2(vecs);
 * while (solution.hasNext()) result.add(solution.next());
 * Output result
 */
}

你可能感兴趣的:(算法)