顶端迭代器
顶端迭代器
给定一个迭代器类的接口,接口包含两个方法:next()
和hasNext()
。设计并实现一个支持peek()
操作的顶端迭代器--
其本质就是把原本应由next()
方法返回的元素peek()
出来。
示例#
假设迭代器被初始化为列表 [1,2,3]。
调用 next() 返回 1,得到列表中的第一个元素。
现在调用 peek() 返回 2,下一个元素。在此之后调用 next() 仍然返回 2。
最后一次调用 next() 返回 3,末尾元素。在此之后调用 hasNext() 应该返回 false。
题解#
/**
* // 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.cache = null;
};
/**
* @return {number}
*/
PeekingIterator.prototype.peek = function() {
if(this.cache !== null) return this.cache;
var cache = this.iterator.next();
this.cache = cache;
return cache;
};
/**
* @return {number}
*/
PeekingIterator.prototype.next = function() {
if(this.cache !== null) {
var cache = this.cache;
this.cache = null;
return cache;
}
return this.iterator.next();
};
/**
* @return {boolean}
*/
PeekingIterator.prototype.hasNext = function() {
if(this.cache !== null) return true;
return this.iterator.hasNext();
};
/**
* 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()
*/
思路#
本题的意思是现在已经有一个迭代器iterator
,其实现了两个方法next()
和hasNext()
,需要通过这两个方法实现一个新的迭代器方法peek()
,通过实现PeekingIterator
构造函数以及new
实例化构造函数,那么在PeekingIterator
构造函数的原型链上实现next()
、hasNext()
和peek()
方法即可,实例化对象时赋值传入的iterator
对象的引用到iterator
属相中,定义cache
属性作为缓存并初始化赋值为null
,首先实现peek()
方法,在调用该方法时首先取出迭代器对象的next
值,并将其写到cache
属性中然后返回该值,然后实现next()
方法,首先判断cache
是否为null
,存在缓存则将缓存置为null
且返回缓存值,不存在缓存则直接调用迭代器的next()
方法,同样对于hasNext()
方法的实现,首先判断缓存是否存在,如果存在缓存则认为并未迭代完成,若不存在缓存则调用迭代器的hasNext()
进行判断。
每日一题#
https://github.com/WindrunnerMax/EveryDay
题源#
https://leetcode-cn.com/problems/peeking-iterator/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理