Google/LintCode:M-摊平嵌套的列表
2017-08-09 19:48
344 查看
题目
题目来源:Link给你一个嵌套的列表,实现一个迭代器将其摊平。
一个列表的每个元素可能是整数或者一个列表。
注意事项
You don't need to implement the remove method.
您在真实的面试中是否遇到过这个题?
Yes
样例
给出列表
[[1,1],2,[1,1]],经过迭代器之后返回
[1,1,2,1,1]。
给出列表
[1,[4,[6]]],经过迭代器之后返回
[1,4,6]。
代码
(1)巧妙利用堆栈(用List实现)
/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * public interface NestedInteger { * * // @return true if this NestedInteger holds a single integer, * // rather than a nested list. * public boolean isInteger(); * * // @return the single integer that this NestedInteger holds, * // if it holds a single integer * // Return null if this NestedInteger holds a nested list * public Integer getInteger(); * * // @return the nested list that this NestedInteger holds, * // if it holds a nested list * // Return null if this NestedInteger holds a single integer * public List<NestedInteger> getList(); * } */ import java.util.Iterator; public class NestedIterator implements Iterator<Integer> { List<NestedInteger> list; public NestedIterator(List<NestedInteger> nestedList) { // Initialize your data structure here. if(nestedList==null) return; list = nestedList; } // @return {int} the next element in the iteration @Override public Integer next() { // Write your code here return nextNum; } Integer nextNum; // @return {boolean} true if the iteration has more element or false @Override public boolean hasNext() { // Write your code here while(list.size()!=0){ NestedInteger tmp = list.get(0); list.remove(0); if(tmp.isInteger()){ //list.remove(0); //list.add(0,tmp); nextNum = tmp.getInteger(); return true; }else{ List<NestedInteger> tmpList = tmp.getList(); if(tmpList.size()!=0){ for(int i=tmpList.size()-1; i>=0; i--){ list.add(0, tmpList.get(i)); } } } } return false; } @Override public void remove() { if(hasNext()){ list.remove(0); } } } /** * Your NestedIterator object will be instantiated and called as such: * NestedIterator i = new NestedIterator(nestedList); * while (i.hasNext()) v.add(i.next()); */
(2)迭代(会超时)
/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * public interface NestedInteger { * * // @return true if this NestedInteger holds a single integer, * // rather than a nested list. * public boolean isInteger(); * * // @return the single integer that this NestedInteger holds, * // if it holds a single integer * // Return null if this NestedInteger holds a nested list * public Integer getInteger(); * * // @return the nested list that this NestedInteger holds, * // if it holds a nested list * // Return null if this NestedInteger holds a single integer * public List<NestedInteger> getList(); * } */ import java.util.Iterator; public class NestedIterator implements Iterator<Integer> { List<Integer> list = new ArrayList<Integer>(); public NestedIterator(List<NestedInteger> nestedList) { // Initialize your data structure here. if(nestedList==null) return; solve(nestedList); } void solve(List<NestedInteger> tList){ if(tList.size()==0) return; for(int i=0; i<tList.size(); i++){ NestedInteger tmp = tList.get(i); if(tmp.isInteger()){ list.add(tmp.getInteger()); }else{ solve(tmp.getList()); } } } // @return {int} the next element in the iteration @Override public Integer next() { // Write your code here int tmp = list.get(0); list.remove(0);//一定要remove,否则报错 return tmp; } // @return {boolean} true if the iteration has more element or false @Override public boolean hasNext() { // Write your code here if(list.size()>0) return true; else return false; } @Override public void remove() { if(hasNext()){ list.remove(0); } } } /** * Your NestedIterator object will be instantiated and called as such: * NestedIterator i = new NestedIterator(nestedList); * while (i.hasNext()) v.add(i.next()); */
相关文章推荐
- LintCode: 摊平嵌套的列表
- lintcode--摊平嵌套的列表
- Google/LintCode:M-搜索二维矩阵 II
- Google/LintCode:M-超级丑数
- Google/LintCode:M-合并k个排序链表
- lintcode&九章算法——Google面试题:原子计数
- Google/LintCode:M-最大平均值子数组
- Google/LintCode:M-带最小值操作的栈
- lintcode&九章算法——Google 面试题 | 字典里面的最长单词 ? 待解决
- lintcode(528)摊平嵌套的列表
- lintcode&九章算法——Google面试题 | 有效括号字符串 ? 待解决
- Google/LintCode:E-Big Integer Addition
- lintcode&九章算法——Google 面试题 | 多余的连接 ? 待解决
- LintCode之22 平面列表
- [原创]企业Web2.0项目开发必备 - http://code.google.com/p/jslint-toolkit/
- Lintcode:平面列表
- Google/LintCode:M-Insert Delete GetRandom O(1)
- LintCode-排序列表转换为二分查找树分析及实例
- Google/LintCode:M-寻找峰值
- Google/LintCode:E-Guess Number Game