「前端刷题」284.顶端迭代器(MEDIUM)

36 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

题目(Peeking Iterator)

链接:https://leetcode-cn.com/problems/peeking-iterator
解决数:246
通过率:76.6%
标签:设计 数组 迭代器 
相关公司:google apple amazon 

请你在设计一个迭代器,在集成现有迭代器拥有的 hasNext 和 next 操作的基础上,还额外支持 peek 操作。

实现 PeekingIterator 类:

  • PeekingIterator(Iterator<int> nums) 使用指定整数迭代器 nums 初始化迭代器。
  • int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
  • bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 false 。
  • int peek() 返回数组中的下一个元素,但  移动指针。

注意: 每种语言可能有不同的构造函数和迭代器 Iterator,但均支持 int next() 和 boolean hasNext() 函数。

 

示例 1:

输入:
["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 的调用均有效
  • nexthasNext 和 peek 最多调用  1000 次

 

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

思路

对比 PeekingIteratorIterator,多了一个 peek 操作。 观察peek的行为,可以得出,next操作的值,可以通过peek重复使用; 那么我们只要把 next 值,用一个变量保存起来即可。 让 PeekingIterator 多走一步,并将这一个结果,保存在 _next 中,供用户查询使用

代码

/**
 * // This is the Iterator's API interface.
 * // You should not implement it, or speculate about its implementation.
 * function Iterator() {
 *    @ return {number}
 *    this.next = function() { // return the next number of the iterator
 *       ...
 *    }; 
 *
 *    @return {boolean}
 *    this.hasNext = function() { // return true if it still has numbers
 *       ...
 *    };
 * };
 */

/**
 * @param {Iterator} iterator
 */
var PeekingIterator = function(iterator) {
    this._iterator = iterator;
    this._next = undefined;
    this.next();
};

/**
 * @return {number}
 */
PeekingIterator.prototype.peek = function() {
    return this._next;
};

/**
 * @return {number}
 */
PeekingIterator.prototype.next = function() {
    let n = this._next;
    this._next = this._iterator.hasNext() ? this._iterator.next() : null;
    return n;
};

/**
 * @return {boolean}
 */
PeekingIterator.prototype.hasNext = function() {
    return this._next !== null;
};

/** 
 * Your PeekingIterator object will be instantiated and called as such:
 * var obj = new PeekingIterator(arr)
 * var param_1 = obj.peek()
 * var param_2 = obj.next()
 * var param_3 = obj.hasNext()
 */