284. Peeking Iterator

LeetCode medium original: C# #array #csharp #design #leetcode #medium
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

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

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

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

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

boolean hasNext(): returns true, если в 배열е еще есть elementы.

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

예제:

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# 해법

매칭됨/원본
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++ 해법

자동 초안, 제출 전 검토
#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 해법

매칭됨/원본
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 해법

매칭됨/원본
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 해법

매칭됨/원본
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 해법

매칭됨/원본
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

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.