diff --git a/284.peeking_iterator.md b/284.peeking_iterator.md new file mode 100644 index 0000000..28b5f98 --- /dev/null +++ b/284.peeking_iterator.md @@ -0,0 +1,76 @@ +[To Index](/index.md) +--- +# 284.Peeking Iterator +难度:Medium +> Given an Iterator class interface with methods: `next()` and `hasNext()`, design and implement a PeekingIterator that support the `peek()` operation -- it essentially `peek()` at the element that will be returned by the next call to `next()`. + +Example: + +``` +Assume that the iterator is initialized to the beginning of the list: [1,2,3]. + +Call next() gets you 1, the first element in the list. +Now you call peek() and it returns 2, the next element. Calling next() after that still return 2. +You call next() the final time and it returns 3, the last element. +Calling hasNext() after that should return false. +``` + +Follow up: How would you extend your design to be generic and work with all types, not just integer? + +We can set a right value stands for next value, a bool stands for hasNext() function. +Codes are as follows: + +``` +// Below is the interface for Iterator, which is already defined for you. +// **DO NOT** modify the interface for Iterator. + +class Iterator { + struct Data; + Data* data; +public: + Iterator(const vector& nums); + Iterator(const Iterator& iter); + virtual ~Iterator(); + // Returns the next element in the iteration. + int next(); + // Returns true if the iteration has more elements. + bool hasNext() const; +}; + + +class PeekingIterator : public Iterator { +int right; +bool flag; +public: + PeekingIterator(const vector& nums) : Iterator(nums) { + // Initialize any member here. + // **DO NOT** save a copy of nums and manipulate it directly. + // You should only use the Iterator interface methods. + flag= Iterator::hasNext(); + right = Iterator::next(); + } + + // Returns the next element in the iteration without advancing the iterator. + int peek() { + return right; + } + + // hasNext() and next() should behave the same as in the Iterator interface. + // Override them if needed. + int next() { + int cur=right; + flag = Iterator::hasNext(); + if(flag) + { + right = Iterator::next(); + } + return cur; + } + + bool hasNext() const { + return flag; + } +}; +``` +> 执行用时 :8 ms, 在所有 C++ 提交中击败了64.25%的用户 +内存消耗 :9.9 MB, 在所有 C++ 提交中击败了38.30%的用户 diff --git a/SUMMARY.md b/SUMMARY.md index 8da5a92..8391d06 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -76,6 +76,7 @@ Leetcode Index - [263.Ugly Numbers](/263.ugly_numbers.md) - [268.Missing Number](/268.missing_number.md) - [278.First Bad Version](/278.first_bad_version.md) +- [284.Peeking Iterator](/284.peeking_iterator.md) - [290.Word Pattern](/290.word_pattern.md) - [282.Nim Game](/292.nim_game.md) - [303.Range Sum Query Immutable](/303.range_sum_query_immutable.md) diff --git a/index.md b/index.md index 8da5a92..8391d06 100644 --- a/index.md +++ b/index.md @@ -76,6 +76,7 @@ Leetcode Index - [263.Ugly Numbers](/263.ugly_numbers.md) - [268.Missing Number](/268.missing_number.md) - [278.First Bad Version](/278.first_bad_version.md) +- [284.Peeking Iterator](/284.peeking_iterator.md) - [290.Word Pattern](/290.word_pattern.md) - [282.Nim Game](/292.nim_game.md) - [303.Range Sum Query Immutable](/303.range_sum_query_immutable.md)