← Static tasks

251. Flatten 2D Vector

leetcode medium

#array#csharp#design#leetcode#medium

Task

Разработайте итератор для разворачивания двумерного вектора. Он должен поддерживать операции next и hasNext.

Реализуйте класс Vector2D:

Vector2D(int[][] vec) инициализирует объект двумерным вектором vec.

next() возвращает следующий элемент из двумерного вектора и перемещает указатель на один шаг вперед. Вы можете предположить, что все вызовы next допустимы.

hasNext() возвращает true, если в векторе еще остались элементы, и false в противном случае.

Пример

Input

["Vector2D", "next", "next", "next", "hasNext", "hasNext", "next", "hasNext"]

[[[[1, 2], [3], [4]]], [], [], [], [], [], [], []]

Output

[null, 1, 2, 3, true, true, 4, false]

Explanation

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

vector2D.next(); // return 1

vector2D.next(); // return 2

vector2D.next(); // return 3

vector2D.hasNext(); // return True

vector2D.hasNext(); // return True

vector2D.next(); // return 4

vector2D.hasNext(); // return False

C# solution

matched/original
using System.Collections.Generic;
public class Vector2D {
    private List<int> nums;
    private int position;
    public Vector2D(IList<IList<int>> v) {
        nums = new List<int>();
        foreach (var innerList in v) {
            nums.AddRange(innerList);
        }
        position = -1;
    }
    public int Next() {
        position++;
        return nums[position];
    }
    public bool HasNext() {
        return position + 1 < nums.Count;
    }
}

C++ solution

auto-draft, review before submit
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class Vector2D {
    private List<int> nums;
    private int position;
    public Vector2D(IList<vector<int>> v) {
        nums = new List<int>();
        foreach (var innerList in v) {
            nums.AddRange(innerList);
        }
        position = -1;
    }
    public int Next() {
        position++;
        return nums[position];
    }
    public bool HasNext() {
        return position + 1 < nums.size();
    }
}

Java solution

matched/original
import java.util.ArrayList;
import java.util.List;

public class Vector2D {
    private List<Integer> nums;
    private int position;

    public Vector2D(List<List<Integer>> v) {
        nums = new ArrayList<>();
        for (List<Integer> innerList : v) {
            nums.addAll(innerList);
        }
        position = -1;
    }

    public int next() {
        position++;
        return nums.get(position);
    }

    public boolean hasNext() {
        return position + 1 < nums.size();
    }
}

JavaScript solution

matched/original
class Vector2D {
    constructor(v) {
        this.nums = [].concat(...v);
        this.position = -1;
    }

    next() {
        this.position++;
        return this.nums[this.position];
    }

    hasNext() {
        return this.position + 1 < this.nums.length;
    }
}

Python solution

matched/original
class Vector2D:
    def __init__(self, v):
        self.nums = [num for inner_list in v for num in inner_list]
        self.position = -1

    def next(self):
        self.position += 1
        return self.nums[self.position]

    def hasNext(self):
        return self.position + 1 < len(self.nums)

Go solution

matched/original
type Vector2D struct {
    nums    []int
    position int
}

func Constructor(v [][]int) Vector2D {
    nums := make([]int, 0)
    for _, innerList := range v {
        nums = append(nums, innerList...)
    }
    return Vector2D{nums, -1}
}

func (this *Vector2D) Next() int {
    this.position++
    return this.nums[this.position]
}

func (this *Vector2D) HasNext() bool {
    return this.position + 1 < len(this.nums)
}

Explanation

Algorithm

1️⃣

Инициализация: Установите указатель position так, чтобы он указывал на следующий элемент массива, который должен быть возвращен методом next(). Это обеспечивает, что position всегда готов к получению следующего действительного элемента.

2️⃣

Проверка доступности: Реализуйте метод hasNext(), который просто проверяет, находится ли индекс position в пределах допустимых индексов массива nums. Этот метод вернет true, если position указывает на действительный индекс, и false в противном случае.

3️⃣

Получение следующего элемента: Метод next() возвращает элемент в текущей позиции position и продвигает указатель position на следующий индекс. Эта операция обеспечивает, что после вызова next(), position обновляется и указывает на следующий элемент, готовый к следующему вызову next().

😎