持续创作,加速成长!这是我参与「掘金日新计划 · 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
的调用均有效 next
、hasNext
和peek
最多调用1000
次
进阶: 你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?
思路
对比 PeekingIterator
与 Iterator
,多了一个 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()
*/