1. 程式人生 > 其它 >刷題-力扣-284. 窺探迭代器

刷題-力扣-284. 窺探迭代器

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 次

進階:你將如何拓展你的設計?使之變得通用化,從而適應所有的型別,而不只是整數型?

題目分析

  1. 根據題目描述模擬頂端迭代器

程式碼

/*
 * 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;
	}
};