LeetCode——284. 窥探迭代器(Peeking Iterator)[中等]——分析及代码(Java、C++)

LeetCode——284. 窥探迭代器[Peeking Iterator][中等]——分析及代码[Java、C++]

一、题目

请你设计一个迭代器,除了支持 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 次

进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/peeking-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 迭代器

(1)思路

直接结合各语言的迭代器实现。

Java:
Iterator 接口支持 hasNext() 和 next() 操作,因此,可设计一个 iterator 和 一个 nextELement,分别记录迭代器和下一元素。由于在获取下一元素时,迭代器必须指向该元素,因此可通过直接返回 nextElement 实现 peek() 操作,通过判断 nextElement 是否为空实现 hasNext() 操作,通过返回 nextElement 并移动指针实现 next() 操作。

C++:
实现过程与 Java 类似,由于 int 类型的 nextElement 无法直接用于判断下一元素的存在性,需添加一个 bool 变量 flag,用于记录下一元素是否存在。

(2)代码(Java)

// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

class PeekingIterator implements Iterator<Integer> {
    
    
	Iterator<Integer> iterator;//指针,实际指向下一元素
	Integer nextElement;//下一元素

	public PeekingIterator(Iterator<Integer> iterator) {
    
    
	    this.iterator = iterator;//记录指针
		nextElement = this.iterator.next();//获得下一元素
	}
	
    // Returns the next element in the iteration without advancing the iterator.
	public Integer peek() {
    
    
		return nextElement;//不移动指针,直接返回下一元素
	}
	
	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	@Override
	public Integer next() {
    
    
	    Integer ret = nextElement;//记录待返回的下一元素
		nextElement = iterator.hasNext() ? iterator.next() : null;//移动指针
		return ret;
	}
	
	@Override
	public boolean hasNext() {
    
    
	    return nextElement != null;//通过下一元素是否为空,判断其存在性
	}
}

(3)结果(Java)

执行用时 :4 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :38.4 MB,在所有 Java 提交中击败了 43.92% 的用户。

(4)代码(C++)

/*
 * 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 flag;//下一元素是否存在
	int nextElement;//下一元素

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.
		flag = Iterator::hasNext();//记录下一元素是否存在
		if (flag == true) {
    
    
			nextElement = Iterator::next();//记录下一元素
		}   
	}
	
    // Returns the next element in the iteration without advancing the iterator.
	int peek() {
    
    
        return nextElement;//返回记录好的下一元素
	}
	
	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	int next() {
    
    
		int ret = nextElement;//记录待返回的下一元素值
		flag = Iterator::hasNext();//更新下一元素是否存在
		if (flag == true) {
    
    
			nextElement = Iterator::next();//下一元素存在,则移动指针
		}
	    return ret;
	}
	
	bool hasNext() const {
    
    
	    return flag;//返回下一元素是否存在
	}
};

(5)结果(C++)

执行用时 :0 ms,在所有 C++ 提交中击败了 100.00% 的用户;
内存消耗 :7.3 MB,在所有 C++ 提交中击败了 52.96% 的用户。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/120610225
今日推荐