LeetCode题练习与总结:窥视迭代器--284

news2024/10/8 13:37:45

一、题目描述

请你在设计一个迭代器,在集成现有迭代器拥有的 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 次

二、解题思路

为了实现PeekingIterator类,我们需要在内部维护一个迭代器的状态,并在每次调用nextpeek时更新这个状态。以下是具体的实现步骤:

  1. 在构造函数中,我们需要接收一个整数迭代器nums,并初始化内部状态。我们可以定义一个变量nextElement来存储下一个元素,并在构造函数中立即调用一次next()来填充这个变量。

  2. 实现peek()方法时,我们只需要返回nextElement,而不需要更新迭代器的状态。

  3. 实现next()方法时,我们需要返回nextElement,并在返回之前调用迭代器的next()方法来更新nextElement

  4. 实现hasNext()方法时,我们只需要检查nextElement是否为null,如果是null,则说明没有下一个元素了。

三、具体代码

class PeekingIterator implements Iterator<Integer> {
    private Integer nextElement = null;
    private Iterator<Integer> iterator;

    public PeekingIterator(Iterator<Integer> iterator) {
        // Initialize any member here.
        this.iterator = iterator;
        if (this.iterator.hasNext()) {
            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 current = nextElement;
        nextElement = iterator.hasNext() ? iterator.next() : null;
        return current;
    }

    @Override
    public boolean hasNext() {
        return nextElement != null;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • PeekingIterator(Iterator<Integer> iterator):构造函数中调用了hasNext()next()方法,这两个操作的时间复杂度都是O(1),因此构造函数的时间复杂度是O(1)。

  • peek():该方法直接返回nextElement变量,不涉及任何循环或递归调用,因此时间复杂度是O(1)。

  • next():该方法首先保存nextElement的值,然后检查迭代器是否有下一个元素,如果有,则调用next()方法。由于每次调用next()时,迭代器都会移动到下一个元素,这个操作的时间复杂度是O(1)。因此,next()方法的时间复杂度也是O(1)。

  • hasNext():该方法检查nextElement是否为null,这是一个直接的变量访问操作,时间复杂度是O(1)。

综上所述,PeekingIterator类中所有方法的时间复杂度都是O(1)。

2. 空间复杂度
  • PeekingIterator(Iterator<Integer> iterator):构造函数中,我们声明了一个nextElement变量和一个iterator变量。这两个变量的大小不依赖于输入数据的大小,因此空间复杂度是O(1)。

  • peek():该方法没有使用额外的空间,所以空间复杂度是O(1)。

  • next():该方法在执行过程中没有使用额外的空间,除了更新nextElement,所以空间复杂度是O(1)。

  • hasNext():该方法没有使用额外的空间,所以空间复杂度是O(1)。

因此,PeekingIterator类的空间复杂度也是O(1),即常数空间复杂度。这意味着无论输入数据的大小如何,PeekingIterator类使用的空间量保持不变。

五、总结知识点

  • 接口实现(Interface Implementation)

    • PeekingIterator类实现了Iterator<Integer>接口,这意味着它必须提供next()hasNext(), 和remove()方法(尽管在这个类中,remove()方法没有被重写)。
  • 成员变量(Member Variables)

    • nextElement:一个Integer类型的成员变量,用于存储下一次调用next()时将返回的元素。
    • iterator:一个Iterator<Integer>类型的成员变量,用于存储传入的迭代器实例。
  • 构造函数(Constructor)

    • 构造函数接收一个Iterator<Integer>类型的参数,并在内部初始化成员变量。
  • 方法重写(Method Overriding)

    • next():重写了Iterator接口中的next()方法。
    • hasNext():重写了Iterator接口中的hasNext()方法。
  • 条件判断(Conditional Statements)

    • 在构造函数和next()方法中使用了if语句来判断迭代器是否有下一个元素。
  • 三目运算符(Ternary Operator)

    • next()方法中使用三目运算符来简洁地决定nextElement的值。
  • 方法调用(Method Calls)

    • 调用传入迭代器的hasNext()next()方法。
  • 封装(Encapsulation)

    • nextElement被封装在类内部,外部无法直接访问,只能通过peek()方法来查看下一个元素。
  • 返回值(Return Values)

    • peek()方法返回nextElement,但不修改它。
    • next()方法返回nextElement,并更新nextElement为迭代器的下一个元素。
    • hasNext()方法返回一个布尔值,表示是否还有更多的元素。
  • 异常处理(Exception Handling)

    • 虽然在这个类中没有显式地处理异常,但实现迭代器时应该考虑可能抛出的NoSuchElementException(当没有更多元素时调用next())。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Canvas与标牌】盾形银底红带Best Quality Premium标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>BestQulityPremium金属牌重制版Draft2</title><style type&…

【YOLOv8实时产品缺陷检测】

YOLOv8应用于产品缺陷检测实例 项目概况项目实现YOLOv8安装及模型训练关键代码展示动态效果展示 项目概况 本项目是应用YOLOv8框架实现训练自定义模型实现单一零件的缺陷检测&#xff0c;软件界面由PyQt5实现。 功能已正式使用&#xff0c;识别效果达到预期。 项目实现 项目…

刷题 二分查找

二分查找 二分查找的本质就是 缩小有效范围 需要注意&#xff1a; int mid (left right) / 2; int mid left (right - left) / 2; 防止溢出 hot100 - 二分查找 ⭐️35. 搜索插入位置 找到第一个大于等于 target 的值 class Solution { public:// 目标: 找到第一个大于…

PD取电诱骗协议芯片支持PD3.1 支持大电流、大功率(28V5A 140W)快速充电。

PD取电快充协议芯片XSP16是受电端的一种PD取电快充协议芯片&#xff0c;它支持PD2.0/3.0&#xff0c;PD3.1、QC2.0/3.0、华为SCP/FCP、三星AFC等快充协议。支持UART串口发送电压/电流消息&#xff0c;供外部MCU读取&#xff0c;以便适应不同的负载。支持从充电器、车充、充电宝…

计算机基础知识:计算机中丢失 msvcr110.dll怎么修复?

1. msvcp110.dll 介绍 1.1 定义&#xff1a;Microsoft Visual C 2012的一部分 msvcp110.dll是Microsoft Visual C 2012 Redistributable Package的一部分&#xff0c;这是一个运行时库文件&#xff0c;包含了Microsoft Visual C 2012编译器所构建程序所需的函数和资源。 1.2…

使用Markdown Here插件生成邮件样式

使用Markdown Here插件生成邮件样式 通常大学生们都有给老师、助教使用邮箱发送作业的情景&#xff0c;怎样让自己发送的邮件美观呢&#xff0c;我们可以使用Markdown Here插件美化 以下为结果展示 Markdown Here 插件 官网地址 html代码 <font size"7", face…

大数据ETL数据提取转换和加载处理

什么是 ETL&#xff1f; 提取转换加载&#xff08;英语&#xff1a;Extract, transform, load&#xff0c;简称ETL&#xff09;&#xff0c;用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。 ETL&…

迎接国庆旅游热潮,火山引擎数据飞轮助力景区数智化升级

随着人们生活水平的提高和旅游消费观念的转变&#xff0c;国庆假期成为人们出行旅游的黄金时段。同程旅行发布的报告显示&#xff0c;北京、杭州、重庆、上海、南京、成都等城市仍是 “十一” 假期国内热门的目的地&#xff0c;而一些新兴的宝藏旅游目的地如新疆阿勒泰、云南迪…

《向量数据库指南》——Fivetran+Mlivus Cloud:打造AI搜索神器

哈哈,各位向量数据库和 AI 应用的同仁们,今天咱们来聊聊一个超级实用的话题——如何借助 Fivetran 和 Mlivus Cloud 构建 AI 驱动的搜索工具,从非结构化数据中挖掘出无尽的宝藏! 在这个信息爆炸的时代,非结构化数据已经成为了企业最重要的资产之一。它包含了大量的文本、…

进入猛增模式后,小米股价还剩下多少上涨空间?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小米集团的股价已经上涨到了2022年以来的最高点。 &#xff08;2&#xff09;股价从2023年的最低点上涨了185%以上。 &#xff08;3&#xff09;随着智能手机的需求反弹和电动汽车利润率的增长&#xff0c;猛兽财经认为…

YOLOv10改进策略【注意力机制篇】| NAM 即插即用模块,重新优化通道和空间注意力(含二次创新)

一、本文介绍 本文记录的是基于NAM模块的YOLOv10目标检测改进方法研究。 许多先前的研究专注于通过注意力操作捕获显著特征&#xff0c;但缺乏对权重贡献因素的考虑&#xff0c;而这些因素能够进一步抑制不重要的通道或像素。而本文利用NAM改进YOLOv10&#xff0c;通过权重的贡…

数字人直播违规被“封”,一文助你彻底解决!

随着数字人直播的日渐兴起&#xff0c;与之相关的各类消息逐渐进入到人们的视野之中&#xff0c;并开始成为众多企业、创业者以及技术爱好者所重点关注的对象。就目前的讨论情况来看&#xff0c;热度最高且讨论次数最多的便是数字人直播违规吗这一话题。 的确&#xff0c;从数字…

一个three三维 文字 粒子 着色器的作品用来感谢大家对github点星

一个three三维 文字 粒子 着色器的作品用来感谢大家对github点星 源链接&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idtextStarShader 国内站点预览&#xff1a;http://threehub.cn github地…

CVE-2024-9014 pgAdmin4 OAuth2 client ID与secret敏感信息泄漏漏洞

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 pgAdmin4 是开源数据库 PostgreSQL 的图形管理工具攻击者可构造恶意…

向量数据库!AI 时代的变革者还是泡沫?

向量数据库&#xff01;AI 时代的变革者还是泡沫&#xff1f; 前言一、向量数据库的基本概念和原理二、向量数据库在AI中的应用场景三、向量数据库的优势和挑战四、向量数据库的发展现状和未来趋势五、向量数据库对AI发展的影响 前言 数据是 AI 的核心&#xff0c;而向量则是数…

一个设备不知道ip地址怎么办?应对策略来袭

在数字化时代&#xff0c;设备连接网络已成常态&#xff0c;IP地址作为设备的网络身份证&#xff0c;其重要性不言而喻。然而&#xff0c;面对设备IP地址遗失的困境&#xff0c;我们往往感到束手无策。 那么&#xff0c;一个设备不知道IP地址怎么办&#xff1f;本文将为你提供一…

中国通信技术革命史

文章目录 引言I 中国通信技术革命史电报中国卫星通信的历史固定电话寻呼机(BP机)大哥大(手机)制定自己的移动通信网络技术体系5G未来科技发展的总趋势:用更少的能量,传输、处理和存储更多的信息II 知识扩展通信史(单位能量的信息传输率越来越高,网络地不断融合。)超级智能…

秒杀系统的原则和注意项

做任何技术方案都需要结合当时的业务场景、资金情况、用户体量等维度综合考虑&#xff0c;没有最好的技术方案&#xff0c;只有最合适的技术方案。 做秒杀方案亦是如此&#xff0c;秒杀活动经常会引发高并发、系统宕机和库存超卖的棘手问题&#xff0c;作为开发者&#xff0c;我…

火情监测摄像机:守护生命与财产安全的“眼睛”

随着城市化进程的加快&#xff0c;火灾隐患日益增多。为了有效预防和及时应对火灾事故&#xff0c;火情监测摄像机应运而生&#xff0c;成为现代消防安全的重要组成部分。这种高科技设备不仅能够实时监控火灾发生&#xff0c;还能为救援提供宝贵的信息支持。火情监测摄像机主要…

vulnhub-THE PLANETS-EARTH靶机

下载并导入靶机至VMWare&#xff0c;设置网络模式为NAT&#xff0c;开机 开启攻击机&#xff08;kali&#xff09;&#xff0c;也设置为Nat模式&#xff0c;与靶机处于同一网段 扫描靶机ip Nmap 192.168.114.0/24 扫描网段内活跃的主机 可以推断靶机ip为192.168.114.129 扫描…