284. Peeking Iterator
Создайте итератор, который поддерживает операцию peek (просмотр следующего elementа) на существующем итераторе, помимо операций hasNext (проверка наличия следующего elementа) и next (получение следующего elementа).
Реализуйте класс PeekingIterator:
PeekingIterator(Iterator<int> nums): Инициализирует объект с заданным итератором целых чисел.
int next(): returns следующий element в Arrayе и перемещает указатель на следующий element.
boolean hasNext(): returns true, если в Arrayе еще есть elementы.
int peek(): returns следующий element в Arrayе без перемещения указателя.
Beispiel:
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ösung
zugeordnet/originalusing 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ösung
Auto-Entwurf, vor dem Einreichen prüfen#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ösung
zugeordnet/originalimport 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ösung
zugeordnet/originalclass 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ösung
zugeordnet/originalclass 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ösung
zugeordnet/originaltype 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 в противном случае.
😎
Stellen zu dieser Aufgabe
aktive Stellen with overlapping task tags are angezeigt.