题目:

给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。

实现扁平迭代器类 NestedIterator :

  • NestedIterator(List<NestedInteger> nestedList) 用嵌套列表 nestedList 初始化迭代器。
  • int next() 返回嵌套列表的下一个整数。
  • boolean hasNext() 如果仍然存在待迭代的整数,返回 true ;否则,返回 false 。

你的代码将会用下述伪代码检测:

initialize iterator with nestedList
res = []
while iterator.hasNext()
append iterator.next() to the end of res
return res

如果 res 与预期的扁平化列表匹配,那么你的代码将会被判为正确。

示例 1:

输入:nestedList = [[1,1],2,[1,1]]
输出:[1,1,2,1,1]
解释:通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。
示例 2:

输入:nestedList = [1,[4,[6]]]
输出:[1,4,6]
解释:通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,4,6]。

提示:

  • 1 <= nestedList.length <= 500
  • 嵌套列表中的整数值在范围 [-106, 106] 内

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/flatten-nested-list-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

解释中给出了三种方法:

  • isInteger() // 判断元素是否为数字
  • getInteger() // 获取数字元素
  • getList() // 获取非数字元素

调用方法:

/**
* Your NestedIterator will be called like this:
* var i = new NestedIterator(nestedList), a = [];
* while (i.hasNext()) a.push(i.next());
*/

一、栈

将列表中的元素从后往前的顺序放入栈中,这样列表中头元素就在栈顶。

每次调用next()时需要判断 hasNext()返回的结果,判断下一个对象是否为整数:

  • 如果是整数:将栈顶元素弹出,并返回该整数;
  • 如果是列表:将该列表中的元素从后往前遍历,依次放入栈中,然后递归判断栈顶元素是否为整数。

注意:

1.栈中存放的类型为:NestedInteger,因为不仅可能为整数还可能为一个整数

2.--i:先往前移一位再使用,例如[1,2,[1,1]],先遍历到[1,1],然后--i,遍历到2...

代码:

 1 public class NestedIterator implements Iterator<Integer> {
2 Deque<NestedInteger> stack = new ArrayDeque<>();
3
4 public NestedIterator(List<NestedInteger> nestedList) {
5 //从后往前遍历,存放入栈,保证表头在栈顶
6 for(int i = nestedList.size()-1; i >= 0; --i){
7 stack.addLast(nestedList.get(i));
8 }
9 }
10
11 @Override
12 public Integer next() {
13 return hasNext() ? stack.pollLast().getInteger() : -1; //如果还存在迭代的整数,就取栈顶中的数字
14
15 }
16
17 @Override
18 public boolean hasNext() {
19 if(stack.isEmpty()){
20 return false;
21 }else{
22 //如果栈顶为整数
23 NestedInteger temp = stack.peekLast();
24 if(temp.isInteger()){
25 return true;
26 }else{
27 //说明栈顶是列表,将列表倒序放入栈,然后递归检查
28 List<NestedInteger> list = stack.pollLast().getList();
29 for(int i = list.size() - 1; i >= 0; --i){
30 stack.addLast(list.get(i));
31 }
32 return hasNext();
33 }
34 }
35
36 }
37 }

 二、DFS(深度优先搜索)

eg: [[2,3], 5,1,[4,2,1]]

先遍历[2,3],发现其是嵌套列表,再遍历2,3,然后依次遍历5,1,再遍历[4,2,1],发现其是嵌套列表,再遍历4,2,1。

利用队列的先进先出的特点,通过递归的方式,将所有的元素压入队列中,next()时,如果队列中有元素直接从队首弹出,否则返回-1。

代码:

 1 public class NestedIterator implements Iterator<Integer> {
2 Deque<Integer> queue = new ArrayDeque<>();
3
4 public NestedIterator(List<NestedInteger> nestedList) {
5 dfs(nestedList);
6 }
7
8 @Override
9 public Integer next() {
10 return hasNext() ? queue.pollFirst() : -1;
11
12 }
13
14 @Override
15 public boolean hasNext() {
16 return !queue.isEmpty();
17 }
18 void dfs(List<NestedInteger> list){
19 for(NestedInteger temp : list){
20 if(temp.isInteger()){
21 queue.addLast(temp.getInteger());
22 }else{
23 dfs(temp.getList());
24 }
25 }
26 }
27 }

双端队列:

力扣341(java)-扁平化嵌套列表迭代器(中等)的更多相关文章

  1. Java实现 LeetCode 341 扁平化嵌套列表迭代器

    341. 扁平化嵌套列表迭代器 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另一个列表.其中列表的元素也可能是整数或是其他列 ...

  2. 【python】Leetcode每日一题-扁平化嵌套列表迭代器

    [python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...

  3. java 扁平化输出json所有节点key/value

    本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...

  4. Java实现 LeetCode 430 扁平化多级双向链表

    430. 扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例 ...

  5. [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  6. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  7. 1.AutoMapper核心:扁平化

    对象 - 对象映射的一个常见用法是获取一个复杂的对象模型,并将其展开成一个更简单的模型. 您可以采取复杂的模型,如: public class Order { private readonly ILi ...

  8. Leetcode 430.扁平化多级双向链表

    扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁 ...

  9. LeetCode 430:扁平化多级双向链表 Flatten a Multilevel Doubly Linked List

    您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁平化列表,使所有结点 ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14  结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...

随机推荐

  1. C#获取Description特性的扩展类

    C#中Description特性主要用于枚举和属性,方法比较简单,记录一下以便后期使用. 扩展类DescriptionExtension代码如下: using System; using System ...

  2. StatefulSet是怎样实现的

    StatefulSet是Kubernetes中用于管理有状态应用的标准实现.与Deployment不同,StatefulSet为每个Pod提供了一个唯一的.稳定的网络标识符,并且Pod的启动和停止顺序 ...

  3. c语言中内存分配malloc,calloc,realloc函数的区别和联系

    一 概念: A malloc() 在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址 B calloc() 与malloc相似,参数size ...

  4. ESP8266 SPI 开发之软件驱动代码分析

    一 基本概述 esp8266的SPI代码流程非常的清晰,主要有三部分构成: spi_init 配置 spi_trans 配置 data_transfer 配置这三块组成. 在这里,笔者就针对spi的这 ...

  5. 记录--封装一个通过js调用的全局vue组件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在使用vue项目编写的时候,不可避免的会碰到需要时js api来调用组件进行显示的情况 例如饿了么element ui 的 Noti ...

  6. 《Effective Java》笔记

    2. 创建和销毁对象 1. 静态工厂方法替代构造器 优点: 名称清晰 每次调用不必new对象 可以返回原返回类型任意子类型对象 返回的对象可以随着调用而发生改变 返回的对象所属的类,在编写该静态工厂方 ...

  7. KingbaseES V8R6运维案例之---普通表toast表故障修复

    案例说明: 数据库在日常的维护过程中,在执行表查询(select),如下图所示,出现"could not read block 0 in file "base/16385/1640 ...

  8. 【Java面试题】Mybatis

    五.MyBatis 40)谈谈 MyBatis Mybatis 是一个半自动化的 ORM 框架,它对 jdbc 的操作数据库的过程进行封装,使得开发者只需要专注于 SQL 语句本身,而不用去关心注册驱 ...

  9. 一篇文章了解CI/CD管道全流程

    从CI/CD过程开始,包含所有阶段并负责创建自动化和无缝的软件交付的一系列步骤称为CI/CD管道工作流.使用CI/CD管道,软件发布工件可以从代码提交阶段到测试.构建.部署和生产阶段在管道中移动和前进 ...

  10. Debug模式调试技巧

    Debug模式调试技巧 断点管理窗口  菜单栏方式 Run -> view breakpoints  Actions方式 双击shift调出Actions窗口,输入view breakpoint ...