力扣341(java)-扁平化嵌套列表迭代器(中等)
题目:
给你一个嵌套的整数列表 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)-扁平化嵌套列表迭代器(中等)的更多相关文章
- Java实现 LeetCode 341 扁平化嵌套列表迭代器
341. 扁平化嵌套列表迭代器 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另一个列表.其中列表的元素也可能是整数或是其他列 ...
- 【python】Leetcode每日一题-扁平化嵌套列表迭代器
[python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...
- java 扁平化输出json所有节点key/value
本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...
- Java实现 LeetCode 430 扁平化多级双向链表
430. 扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例 ...
- [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器
Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 1.AutoMapper核心:扁平化
对象 - 对象映射的一个常见用法是获取一个复杂的对象模型,并将其展开成一个更简单的模型. 您可以采取复杂的模型,如: public class Order { private readonly ILi ...
- Leetcode 430.扁平化多级双向链表
扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁 ...
- LeetCode 430:扁平化多级双向链表 Flatten a Multilevel Doubly Linked List
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁平化列表,使所有结点 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14 结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...
随机推荐
- 安装debian后,发现进入不了root
回想了一下,自己安装的时候,没有设置root密码! 解决方法: sudo passwd root 随后设置密码: 再次su 就可以进入root目录了!
- AWS ES ISM学习应用笔记
Elastic Search 6以上版本推出 ILM,用于管理Index的生命周期,但AWS上的ES是基于OSS版本的ES,所以自己开发了ISM来代替ILM.项目是从logstash往ES写入数据,但 ...
- RTMP录屏直播屏幕数据获取与MediaCodec编码
目录 前言 RTMP直播实现流程 视频采集--MediaProjection 编码--MediaCodec 音频采集--AudioRecord RTMP音频包数据 RTMP视频数据 前言 本文介绍的是 ...
- Redis源码学习(1)──字符串
redis 版本:5.0 本文代码在Redis源码中的位置:redis/src/sds.c.redis/src/sds.h 源码整体结构 src:核心实现代码,用 C 语言编写 tests:单元测试代 ...
- C#(winform)自定义ListItem类方便ComboBox操作
public class ListItem { /// <summary> /// Key /// </summary> public string Key { get; se ...
- verilog之时钟信号的编写2
verilog之时钟信号的编写2 1.时钟信号的特点 时钟信号除了可以根据时序一个个变化列举出来,还可以利用其循环的变化的特点,使用循环执行语句always来实现.这种方法实现的时钟信号可以一直执行且 ...
- KingbaseES V8R3 集群运维案例 -- cluster.log无日志输出问题诊断
案例说明: KingbaseES V8R3集群正常运行期间,现场发现cluster.log日志无任何信息输出,针对这一问题做了复现及提出解决方案.后现场检查发现,cluster.log文件曾被删除: ...
- Hadoop_05 使用xsync脚本命令分发,手动配置脚本
在/usr/local/bin 目录下创建 xsync 文件,向里面添加 1 #!/bin/sh 2 # 获取输入参数个数,如果没有参数,直接退出 3 pcount=$# 4 if((pcount== ...
- 6 HTML图片标签
6 图片标签 在HTML中,图像由标签定义的,它可以用来加载图片到html网页中显示.网页开发过程中,有三种图片格式被广泛应用到web里,分别是 jpg.png.gif. img标签的属性: /* s ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Menu)
一.Menu组件 Menu组件是一种常见的用户界面(UI)控件,用于在移动应用程序中显示可选项列表.它通常由一系列链接或按钮组成,以帮助用户导航和选择所需的操作.Menu组件可以在水平或垂直方向上呈现 ...