284. Peeking Iterator

LeetCode medium original: C# #array #csharp #design #leetcode #medium
题目文本会按所选界面语言从俄语翻译;代码保持不变。

Создайте итератор, который поддерживает операцию 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 已显示.

所有职位
目前还没有活跃职位。