284. Peeking Iterator

LeetCode medium original: C# #array #csharp #design #leetcode #medium
Văn bản bài toán được dịch từ tiếng Nga theo ngôn ngữ giao diện. Mã không thay đổi.

Создайте итератор, который поддерживает операцию peek (просмотр следующего elementа) на существующем итераторе, помимо операций hasNext (проверка наличия следующего elementа) и next (получение следующего elementа).

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

PeekingIterator(Iterator<int> nums): Инициализирует объект с заданным итератором целых чисел.

int next(): returns следующий element в mảngе и перемещает указатель на следующий element.

boolean hasNext(): returns true, если в mảngе еще есть elementы.

int peek(): returns следующий element в mảngе без перемещения указателя.

Ví dụ:

Input

["PeekingIterator", "next", "peek", "next", "next", "hasNext"]

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

Output

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

Explanation

PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3]

peekingIterator.next(); // return 1, the pointer moves to the next element [1,2,3].

peekingIterator.peek(); // return 2, the pointer does not move [1,2,3].

peekingIterator.next(); // return 2, the pointer moves to the next element [1,2,3]

peekingIterator.next(); // return 3, the pointer moves to the next element [1,2,3]

peekingIterator.hasNext(); // return False

C# lời giải

đã khớp/gốc
using System;
using System.Collections.Generic;
public class PeekingIterator {
    private IEnumerator<int> iterator;
    private bool hasPeeked;
    private int peekedElement;
    public PeekingIterator(IEnumerator<int> iterator) {
        this.iterator = iterator;
    }
    public int Next() {
        if (hasPeeked) {
            hasPeeked = false;
            return peekedElement;
        }
        return iterator.MoveNext() ? iterator.Current : throw new InvalidOperationException();
    }
    public bool HasNext() {
        return hasPeeked || iterator.MoveNext();
    }
    public int Peek() {
        if (!hasPeeked) {
            hasPeeked = iterator.MoveNext();
            peekedElement = iterator.Current;
        }
        return peekedElement;
    }
}

C++ lời giải

bản nháp tự động, xem lại trước khi gửi
#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 PeekingIterator {
    private IEnumerator<int> iterator;
    private bool hasPeeked;
    private int peekedElement;
    public PeekingIterator(IEnumerator<int> iterator) {
        this.iterator = iterator;
    }
    public int Next() {
        if (hasPeeked) {
            hasPeeked = false;
            return peekedElement;
        }
        return iterator.MoveNext() ? iterator.Current : throw new InvalidOperationException();
    }
    public bool HasNext() {
        return hasPeeked || iterator.MoveNext();
    }
    public int Peek() {
        if (!hasPeeked) {
            hasPeeked = iterator.MoveNext();
            peekedElement = iterator.Current;
        }
        return peekedElement;
    }
}

Java lời giải

đã khớp/gốc
import java.util.Iterator;
import java.util.NoSuchElementException;

class PeekingIterator implements Iterator<Integer> {

    private Iterator<Integer> iter;
    private Integer next = null;

    public PeekingIterator(Iterator<Integer> iterator) {
        if (iterator.hasNext()) {
            next = iterator.next();
        }
        iter = iterator;
    }

    public Integer peek() {
        return next;
    }

    @Override
    public Integer next() {
        if (next == null) {
            throw new NoSuchElementException();
        }
        Integer toReturn = next;
        next = null;
        if (iter.hasNext()) {
            next = iter.next();
        }
        return toReturn;
    }

    @Override
    public boolean hasNext() {
        return next != null;
    }
}

JavaScript lời giải

đã khớp/gốc
class PeekingIterator {
    constructor(iterator) {
        this.iterator = iterator;
        this.nextElement = iterator.hasNext() ? iterator.next() : null;
    }

    next() {
        const currentElement = this.nextElement;
        this.nextElement = this.iterator.hasNext() ? this.iterator.next() : null;
        return currentElement;
    }

    hasNext() {
        return this.nextElement !== null;
    }

    peek() {
        return this.nextElement;
    }
}

Python lời giải

đã khớp/gốc
class PeekingIterator:
    def __init__(self, iterator):
        self.iterator = iterator
        self.next_element = next(iterator, None)

    def next(self):
        current_element = self.next_element
        self.next_element = next(self.iterator, None)
        return current_element

    def hasNext(self):
        return self.next_element is not None

    def peek(self):
        return self.next_element

Go lời giải

đã khớp/gốc
type PeekingIterator struct {
    iterator  Iterator
    nextElem  *int
}

func Constructor(iter Iterator) *PeekingIterator {
    var next *int
    if iter.HasNext() {
        val := iter.Next()
        next = &val
    }
    return &PeekingIterator{iterator: iter, nextElem: next}
}

func (this *PeekingIterator) hasNext() bool {
    return this.nextElem != nil
}

func (this *PeekingIterator) next() int {
    current := *this.nextElem
    if this.iterator.HasNext() {
        val := this.iterator.Next()
        this.nextElem = &val
    } else {
        this.nextElem = nil
    }
    return current
}

func (this *PeekingIterator) peek() int {
    return *this.nextElem
}

Algorithm

Инициализация итератора:

В конструкторе класса PeekingIterator инициализируйте итератор и проверьте, есть ли следующий element. Если есть, установите его как next, иначе установите next в null.

Операция peek:

Метод peek returns значение next, не перемещая указатель итератора.

Операции next и hasNext:

Метод next returns текущее значение next, обновляет next к следующему elementу в итераторе и перемещает указатель итератора. Если нет следующего elementа, бросает исключение NoSuchElementException.

Метод hasNext returns true, если next не равно null, и false в противном случае.

😎

Vacancies for this task

việc làm đang hoạt động with overlapping task tags are đã hiển thị.

Tất cả việc làm
Chưa có việc làm đang hoạt động.