Zigzag Iterator ii

//23. Zigzag Iterator
/*
Given two 1d vectors, implement an iterator to return their elements alternately.


v1 = [1, 2]
v2 = [3, 4, 5, 6]
v = [1, 3, 2, 4, 5, 6]
*/


/*
解题思路: 实现Iterator的问题是现在面试中一个非常常见的问题,在这个题目中需要借助List的本身自带的
Iterator的方法,进行实现。
*/
public class ZigzagIterator {
    /*
    * @param v1: A 1d vector
    * @param v2: A 1d vector
    */
    Iterator<Integer> it1;
    Iterator<Integer> it2;
    int turn;
    public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
        // do intialization if necessary
        it1 = v1.iterator();
        it2 = v2.iterator();
        turn = 0;
    }


    /*
     * @return: An integer
     */
    public int next() {
        // write your code here
        int val = 0;
        if ((turn % 2 == 0 && it1.hasNext()) || (it1.hasNext() && !it2.hasNext())) {
            val = it1.next();
        } else if ((turn % 2 == 1 && it2.hasNext()) || (it2.hasNext() && !it1.hasNext())) {
            val = it2.next();
        }
        turn++;
        return val;
    }


    /*
     * @return: True if has next
     */
    public boolean hasNext() {
        // write your code here
        return it1.hasNext() || it2.hasNext();
    }
}


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

follow up:


Follow up Zigzag Iterator: What if you are given k 1d vectors? How well can your code be extended to such cases? The "Zigzag" order is not clearly defined and is ambiguous for k > 2 cases. If "Zigzag" does not look right to you, replace "Zigzag" with "Cyclic".

Example

Given k = 3 1d vectors:

[1,2,3]
[4,5,6,7]
[8,9]

Return [1,4,8,2,5,9,3,6,7].

// 解题思路:还是使用Iterator的方法进行处理,设定一个Iterator数组,不断向里面加入数据然后一旦数据
// 使用完毕,就将该iterator删除

public class ZigzagIterator2 {
    /*
    * @param vecs: a list of 1d vectors
    */
    List<Iterator<Integer>> path;
    int turn;
    public ZigzagIterator2(List<List<Integer>> vecs) {
        // do intialization if necessary
        path = new ArrayList<Iterator<Integer>>();
        for (List<Integer> vec : vecs) {
            if (vec.size() > 0) {
                path.add(vec.iterator());
            }
        }
        turn = 0;
    }

    /*
     * @return: An integer
     */
    public int next() {
        // write your code here
        int val = path.get(turn).next();
        if (path.get(turn).hasNext()) {
            turn = (turn + 1) % path.size();
        } else {
            path.remove(turn);
            if (path.size() > 0) {
                turn %= path.size();   
            }
        }
        return val;
    }

    /*
     * @return: True if has next
     */
    public boolean hasNext() {
        // write your code here
        return path.size() > 0;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ncst

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值