顶端迭代器
时间:2022-07-24
本文章向大家介绍顶端迭代器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
顶端迭代器
给定一个迭代器类的接口,接口包含两个方法: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/
- Android 应用安装过程分析
- React Native之TextInput组件实现联想输入
- React Native之轻量级存储AsyncStorage
- [先行者课程]--0312视差效果--课堂笔记
- Android 绿色应用公约
- React-Native组件之 TabBarIOS和TabBarIOS.Item
- [先行者周日课程-0305] web前端组件 之 拖动窗口
- react-native城市列表组件
- [前端常见病] 之 后端数据还没有,前端怎么进行?
- dependencies与devDependencies的区别
- [先行者课程] -- 用js实现倒计时功能的业务逻辑
- iOS如何实现多个环境一次打包
- 从原理到策略算法再到架构产品看推荐系统 | 附Spark实践案例
- MobX 在 React Native开发中的应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 获取指定时间内指定星期几的所有日期
- 使用JSP的标准标签库JSTL处理XML格式的数据
- (一)初识Mybatis-Plus
- org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题
- JAVA中获取当前系统时间
- 使用Supervisor管理进程
- vue 中使用threejs
- 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
- 生成项目目录树
- 几行代码搞定智能插座控制丨云开发 × 涂鸦
- Elasticsearch Mapping是啥?
- 求水仙花数面试题 撸它
- 字典序???你是啥
- 【特征工程】时序特征挖掘的奇技淫巧
- 【Hive】Hive 的基本认识