251. 展开二维向量

251. 展开二维向量

难度:中等

请设计并实现一个能够展开二维向量的迭代器。该迭代器需要支持 nexthasNext 两种操作。

示例:

Vector2D iterator = new Vector2D([[1,2],[3],[4]]);

iterator.next(); // 返回 1
iterator.next(); // 返回 2
iterator.next(); // 返回 3
iterator.hasNext(); // 返回 true
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 4
iterator.hasNext(); // 返回 false

注意:

  1. 请记得 重置 在 Vector2D 中声明的类变量(静态变量),因为类变量会 在多个测试用例中保持不变,影响判题准确。请 查阅 这里。
  2. 你可以假定 next() 的调用总是合法的,即当 next() 被调用时,二维向量总是存在至少一个后续元素。

**进阶:**尝试在代码中仅使用 C++ 提供的迭代器 或 Java 提供的迭代器。

解答:

class Vector2D {
    int[] arr = null;
    int cur = 0;
    
    public Vector2D(int[][] vec){
        int count = 0;
        for(int[] ints : vec) count += ints.length;
        arr = new int[count];
        int index = 0;
        for(int[] ints : vec){
            System.arraycopy(ints, 0, arr, index, ints.length);
            index += ints.length;
        }
    }

    public int next() {
        return arr[cur++];
    }

    public boolean hasNext() {
        return cur < arr.length;
    }
}


import java.util.NoSuchElementException;
class Vector2D {
    private int[][] vector;
    private int inner = 0;
    private int outer = 0;
    
    public Vector2D(int[][] vec) {
        vector = vec;
    }
    
    private void advanceToNext(){
        while(outer < vector.length && inner == vector[outer].length){
            inner = 0;
            outer++;
        }
    }
    
    public int next() {
        if(!hasNext()) throw new NoSuchElementException();
        return vector[outer][inner++];
    }
    
    public boolean hasNext() {
        advanceToNext();
        return outer < vector.length;
    }
}

class Vector2D {
    private Queue<Integer> queue = new LinkedList<>();
    
    public Vector2D(int[][] v) {
        for (int i = 0; i < v.length; i++) {
            for (int j = 0; j < v[i].length; j++){
                queue.offer(v[i][j]);
            }
        }
    }

    public int next() {
        return queue.poll();
    }

    public boolean hasNext() {
        return !queue.isEmpty();
    }
}
/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D obj = new Vector2D(vec);
 * int param_1 = obj.next();
 * boolean param_2 = obj.hasNext();
 */

参考自:

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/flatten-2d-vector/solution/zhan-kai-er-wei-xiang-liang-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode,java)