刷題-力扣-284. 窺探迭代器
阿新 • • 發佈:2021-10-05
284. 窺探迭代器
題目連結
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/peeking-iterator
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
請你設計一個迭代器,除了支援 hasNext 和 next 操作外,還支援 peek 操作。
實現 PeekingIterator 類:
PeekingIterator(int[] nums) 使用指定整數陣列 nums 初始化迭代器。
int next() 返回陣列中的下一個元素,並將指標移動到下個元素處。
bool hasNext() 如果陣列中存在下一個元素,返回 true ;否則,返回 false 。
int peek() 返回陣列中的下一個元素,但 不 移動指標。
示例:
輸入: ["PeekingIterator", "next", "peek", "next", "next", "hasNext"] [[[1, 2, 3]], [], [], [], [], []] 輸出: [null, 1, 2, 2, 3, false] 解釋: PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3] peekingIterator.next(); // 返回 1 ,指標移動到下一個元素 [1,2,3] peekingIterator.peek(); // 返回 2 ,指標未發生移動 [1,2,3] peekingIterator.next(); // 返回 2 ,指標移動到下一個元素 [1,2,3] peekingIterator.next(); // 返回 3 ,指標移動到下一個元素 [1,2,3] peekingIterator.hasNext(); // 返回 False
提示:
- 1 <= nums.length <= 1000
- 1 <= nums[i] <= 1000
- 對 next 和 peek 的呼叫均有效
- next、hasNext 和 peek 最多呼叫 1000 次
進階:你將如何拓展你的設計?使之變得通用化,從而適應所有的型別,而不只是整數型?
題目分析
- 根據題目描述模擬頂端迭代器
程式碼
/* * 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<int>& nums); * Iterator(const Iterator& iter); * * // Returns the next element in the iteration. * int next(); * * // Returns true if the iteration has more elements. * bool hasNext() const; * }; */ class PeekingIterator : public Iterator { private: bool hasNextElem; int nextElem; public: PeekingIterator(const vector<int>& 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. this->hasNextElem = Iterator::hasNext(); if (this->hasNextElem) { this->nextElem = Iterator::next(); } return; } // Returns the next element in the iteration without advancing the iterator. int peek() { return this->nextElem; } // hasNext() and next() should behave the same as in the Iterator interface. // Override them if needed. int next() { int res = this->nextElem; this->hasNextElem = Iterator::hasNext(); if (this->hasNextElem) { this->nextElem = Iterator::next(); } return res; } bool hasNext() const { return this->hasNextElem; } };