力扣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 结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...
随机推荐
- manjaro安装微信deepin-wine-wechat后启动不了
直接将主目录下载的 .deepinwine 删除! 随后,点击图标,重新安装!
- Apollo3-Blue-MCU芯片典型硬件电路解析
一 芯片简介 1.简介 Apollo3 Blue Wireless SoC是一款超低功耗无线mcu芯片,它的运行功耗降至6μA/ MHz以下.该器件采用ARM Cortex M4F内核,运行频率高达9 ...
- Kotlin 集合对象的单条件和多条件排序
原文: Kotlin 集合对象的单条件和多条件排序 - Stars-One的杂货小窝 本文不是太难的东西,因为sortedWith之前没怎么用过,所以就记录下 平常开发经常使用到List,Map等数据 ...
- libwebsockets支持外部eventloop变更
早些年还在使用2.4+版本,现在最新版已经到4.1+,centos 7也使用3.+版本.对于使用外部eventloop相关的接口发生了大的变更.libev也应为早早对iouring支持,4+版本亲睐l ...
- springboot打jar包
参考,欢迎点击原文:https://www.jianshu.com/p/84883627db67(简书) https://www.cnblogs.com/dk1024/p/10802007.html( ...
- java生产者消费者模式代码示例
package test; import java.util.LinkedList; public class Test { public static void main(String[] args ...
- 编码ascii码,unicode码,utf-8编码
1. ASCII ASCII 只有127个字符,表示英文字母的大小写.数字和一些符号,但由于其他语言用ASCII 编码表示字节不够,例如:常用中文需要两个字节,且不能和ASCII冲突,中国定制了GB2 ...
- 深入浅出Java多线程(十三):阻塞队列
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在多线程编程的世界里,生产者-消费者问 ...
- AXI4从机总线分析验证之读取寄存器值
AXI4从机总线分析验证之读取寄存器值 1.实验目的 利用前面所学的AXI4总线协议的理论分析,验证如何将一个PL的输入信号通过AXI发送到PS端.大致思路就是取一个按键,信号接入自建的AXI4的IP ...
- KingbaseES V8R6 备份恢复案例--异机备份ssh认证失败
案例说明: 在生产环境,数据库服务被重启后,监控发现数据库物理备份的脚本无法执行,故障现象如下所示,从备份日志和sys_log中都出现了远程主机连接认证错误. 1)备份日志:(连接数据库服务器认证错误 ...