List里可以有int或者List,然后里面的List里面可以再有List.

用Stack来做比较直观

Iterator无非是next()或者hasNext()这2个方程

一开始我想的是hasNext()就简单的返还是不是空就行,主要的操作在next()里,结果发现无线循环。。好蠢

然后看网上答案改的在hasNext()里准备好,其实一开始的想法不一定错,二刷可以试试。

简单的说就是先都塞到STACK里面,如果Peek的元素是单一int就返还TRUE,然后next()会直接返还那个int。

如果不是单一int,是另一个List,那么把这个List给POP出来,再倒着塞回到stack。

再PEEK第一个,直到是单一INT。

当然,如果没元素了直接返还FALSE就行了,思路很清晰。。


public Stack<NestedInteger> stack = new Stack<>(); public NestedIterator(List<NestedInteger> nestedList) {
for(int n = nestedList.size()-1; n >=0;n--)
{
stack.push(nestedList.get(n));
}
} @Override
public Integer next()
{
if(hasNext()) return stack.pop().getInteger();
else return null;
} @Override
public boolean hasNext() { while(!stack.isEmpty())
{
if(stack.peek().isInteger())
{
return true;
}
else
{
NestedInteger tempNested = stack.pop();
for(int n = tempNested.getList().size()-1; n >= 0;n--)
{
stack.push(tempNested.getList().get(n));
}
}
}
return false;
}

感觉上不是特别难,但是牵扯到的别的概念太多了。

需要注意的是各种TYPE的DECLARE。

一开始挺接近的,使使劲说不定能做出来。


二刷没想到用STACK,用LIST楞做的。在constructor里直接遍历,Integer就加进去,Nested就展开。

有int加int,不是int展开继续加int。

最后就是一个list有所有int,然后就iterator.

public class NestedIterator implements Iterator<Integer> {

    List<Integer> list;

    public NestedIterator(List<NestedInteger> nestedList)
{
list = new ArrayList<Integer>();
for(int i = 0; i < nestedList.size();i++)
{
if(nestedList.get(i).isInteger()) list.add(nestedList.get(i).getInteger());
else
{
List<NestedInteger> tempList = new ArrayList<NestedInteger>(nestedList.get(i).getList());
NestedIterator iter = new NestedIterator(tempList);
while(iter.hasNext()) list.add(iter.next()); }
} } @Override
public Integer next()
{
Integer res = new Integer(list.get(0));
list.remove(0);
return res; } @Override
public boolean hasNext()
{
return list.size() != 0;
}
}

一刷的做法是用stack,添加的时候不操作,遍历的时候进行判断和展开LIST的 操作。

二刷的做法是添加的时候都展了,遍历的时候不展了。 第一种时间上快一些。



三刷

这个题看起来挺难的,但是一刷二刷完全没有印象,回过头看了一下明白怎么回事了。

我一刷应该是看答案的做的,用的stack倒着加,每次POP出一个看是不是Integer,是的话返还,不是的话展开再加。比较直白的做法,需要消耗很大的空间,取决于Stack的大小,具体大小不好算,跟单一枝的宽度有关。

二刷更蠢= =直接完全展开,还不如一刷。。

三刷应该是很合理的,stack里存放的是Iterator,其实相当于保存了一个指针,我们通过pop来back track到当时的位置。。思想是DFS。

这个题更为关键的是应该抽象出树状图的概念,来做in Order。 i.isInteger()说明是一个leave,!i.isInteger()说明是新的subtree,此时要入栈记录位置,以便DFS的时候回到这里。

public class NestedIterator implements Iterator<Integer> {

    Stack<Iterator<NestedInteger>> stk;
Iterator<NestedInteger> tempIter;
Integer temp = null;
public NestedIterator(List<NestedInteger> nestedList) {
stk = new Stack<Iterator<NestedInteger>>();
tempIter = nestedList.iterator();
temp = findNextInt();
} @Override
public Integer next() {
int res = temp;
temp = findNextInt();
return res;
} public Integer findNextInt() {
while (tempIter.hasNext() || !stk.isEmpty()) {
if (tempIter.hasNext()) {
NestedInteger i = tempIter.next();
if (i.isInteger()) {
return i.getInteger();
} else {
stk.push(tempIter);
tempIter = i.getList().iterator();
}
} else {
tempIter = stk.pop();
}
}
return null;
} @Override
public boolean hasNext() {
return temp != null; }
}

341. Flatten Nested List Iterator的更多相关文章

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

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

  2. 341. Flatten Nested List Iterator展开多层数组

    [抄题]: Given a nested list of integers, implement an iterator to flatten it. Each element is either a ...

  3. [LeetCode] 341. Flatten Nested List Iterator 压平嵌套链表迭代器

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

  4. 【leetcode】341. Flatten Nested List Iterator

    题目如下: Given a nested list of integers, implement an iterator to flatten it. Each element is either a ...

  5. 【LeetCode】341. Flatten Nested List Iterator 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归+队列 栈 日期 题目地址:https://lee ...

  6. LeetCode 341. Flatten Nested List Iterator

    https://leetcode.com/problems/flatten-nested-list-iterator/

  7. [LintCode] Flatten Nested List Iterator 压平嵌套链表迭代器

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

  8. [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器

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

  9. Leetcode: Flatten Nested List Iterator

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

随机推荐

  1. NetSerialComm的基本使用方法

    近期搞一个com口传输的小项目,原来认为是一个挺简单的一个小功能,结果生产商发来com以后直接傻眼了,还要对相关的硬件流进行处理 如下 // 硬件流控制设置 dcb.fOutxCtsFlow = FA ...

  2. PL/SQL学习(一)

    原文参考:http://plsql-tutorial.com/ 组成: 声明部分(可选) 执行部分(必选) 异常处理(可选)       声明:         DECLARE       执行:   ...

  3. grunt-npm编译bootstrap源码

    因为gmu需要用编译的方式下载,于是联想到bootstrap什么less sass编译 less先学,据说基于js编译和less编译器,安装起来详细, sass据网上介绍基于ruby, 以下为在mac ...

  4. Leetcode 解题 Add Two Numbers Python

    原题: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  5. bounds的深入研究

    一.bounds的深入研究 1>frame:是以父控件的左上角为原点,描述的是一块区域的可视范围,    bounds:是以自己内容左上角为原点,描述的是可视范围在内容范围显示的区域 2> ...

  6. 点评VHDL语言

    (1)VHDL的描述风格及语法十分类似于一般的计算机高级语言,但是它是一种硬件描述语言.学好VHDL的关键是充分理解VHDL语句和硬件电路的关系.编写VHDL,就是在描述一个电路,我们写完一段程序后, ...

  7. HDU 1394 Minimum Inversion Number 线段树

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...

  8. 数据采集服务提供商,ip提供商 里面有些不错的基础数据

    http://user.qzone.qq.com/1649677458 这家公司的爬虫应该挺牛的 !@#!#!~#¥¥¥@@http://www.site-digger.com/

  9. python的random函数

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  10. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...