力扣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 结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...
随机推荐
- WPF之属性
目录 属性 依赖属性(Dependency Property) 依赖属性对内存的使用方式 声明和使用依赖属性 声明依赖属性 使用依赖属性 依赖属性的"属性" 依赖属性的" ...
- python中把列表中的字符串转成整型的几种方法
python中在不同类型数据转换方面是有标准库的,使用非常方便.但是在开发中,经常在list中字符转成整形的数据方便遇到问题.这里就记录一下常用的几种方法. 方法一:最基本的方法:通过轮训整个list ...
- gcc编译stm32 f103出现错误init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'
解决方法: 方法一:去掉makefile中的编译选项:-nostartfiles 方法二:方法一不凑效的情况下,添加编译选型:--specs=nano.specs
- 🚀🚀🚀Elasticsearch 主副分片切换过程中对业务写入有影响吗
先说下结论,只要集群中的工作节点过半,有候选的master节点,挂掉的节点中不同时包含索引的主分片和副分片,那么ES是可以做到让业务无感知的进行主副分片切换的. 蓝胖子会先讲解下ES集群写入文档的原理 ...
- drf(视图组件)
一. 前言 Django REST framwork 提供的视图的主要作用 1. 控制序列化器的执行(检验.保存.转换数据) 2. 控制数据库查询的执行 二. 两个视图基类 两个视图基类: APIVi ...
- 04.Android之动画问题
目录介绍 4.0.0.1 Android中有哪几种类型的动画,属性动画和补间动画有何区别?补间动画和属性动画常用的有哪些? 4.0.0.2 View动画为何不能真正改变View的位置?而属性动画为何可 ...
- r-nacos v0.4.0版本发布
r-nacos是一个用 rust重新实现的nacos. r-nacos比java实现的nacos更轻量.快速.稳定:合适在开发.测试.受资限服务等环境平替nacos服务使用. r-nacos v0.4 ...
- VS2010插件NuGet
下载地址 NuGet Package Manager - Visual Studio Marketplace NuGet包地址 NuGet Gallery | Home
- Oracle 触发器迁移至KingbaseES常见的问题
oracle数据库的触发器迁移到KingbaseES的时候经常会出现一下两类错误: 1.SQL 错误 [42809]: 错误: "xxxxxxxx" 是一个视图.Detail: 视 ...
- [apue] 书中关于打印服务代码的一个错误
在看 apue 第 21 章 与网络打印机通信一章时,发现一段关于链表操作的代码有问题,现在摘出来让大家 review 一下.先上代码: printd.c 这是打印服务的源代码,在打印时,用户通过 ...