Implement an iterator to flatten a 2d vector.

For example,
Given 2d vector =

[
[1,2],
[3],
[4,5,6]
]

By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,2,3,4,5,6].

Hint:

  1. How many variables do you need to keep track?
  2. Two variables is all you need. Try with x and y.
  3. Beware of empty rows. It could be the first few rows.
  4. To write correct code, think about the invariant to maintain. What is it?
  5. The invariant is x and y must always point to a valid point in the 2d vector. Should you maintain your invariant ahead of time or right when you need it?
  6. Not sure? Think about how you would implement hasNext(). Which is more complex?
  7. Common logic in two different places should be refactored into a common method.

Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.

给一个二维向量数组压平输出为一个数组。要实现一个iterator,包括next和hasNext函数。

解法:将二维数组按顺序先存入到一个一维数组里,然后维护一个变量i来记录当前遍历到的位置,hasNext函数看当前坐标是否小于元素总数,next函数即为取出当前位置元素。

Java:one iterator

public class Vector2D {

    List<Iterator<Integer>> its;
int curr = 0; public Vector2D(List<List<Integer>> vec2d) {
this.its = new ArrayList<Iterator<Integer>>();
for(List<Integer> l : vec2d){
// 只将非空的迭代器加入数组
if(l.size() > 0){
this.its.add(l.iterator());
}
}
} public int next() {
Integer res = its.get(curr).next();
// 如果该迭代器用完了,换到下一个
if(!its.get(curr).hasNext()){
curr++;
}
return res;
} public boolean hasNext() {
return curr < its.size() && its.get(curr).hasNext();
}
}

Java: two iterator

public class Vector2D {

    Iterator<List<Integer>> it;
Iterator<Integer> curr; public Vector2D(List<List<Integer>> vec2d) {
it = vec2d.iterator();
} public int next() {
hasNext();
return curr.next();
} public boolean hasNext() {
// 当前列表的迭代器为空,或者当前迭代器中没有下一个值时,需要更新为下一个迭代器
while((curr == null || !curr.hasNext()) && it.hasNext()){
curr = it.next().iterator();
}
return curr != null && curr.hasNext();
}
}

Java:

public class Vector2D {

    private List<List<Integer>> vec2d;
private int rowId;
private int colId;
private int numRows; public Vector2D(List<List<Integer>> vec2d) {
this.vec2d = vec2d;
rowId = 0;
colId = 0;
numRows = vec2d.size();
} public int next() {
int ans = 0; if (colId < vec2d.get(rowId).size()) {
ans = vec2d.get(rowId).get(colId);
} colId++; if (colId == vec2d.get(rowId).size()) {
colId = 0;
rowId++;
} return ans;
} public boolean hasNext() {
while (rowId < numRows && (vec2d.get(rowId) == null || vec2d.get(rowId).isEmpty())) {
rowId++;
} return vec2d != null &&
!vec2d.isEmpty() &&
rowId < numRows;
}
}  

Java: Followup: As an added challenge, try to code it using only iterators in C++ or iterators in Java.

public class Vector2D {
private Iterator<List<Integer>>outerIterator;
private Iterator<Integer> innerIterator; public Vector2D(List<List<Integer>> vec2d) {
outerIterator = vec2d.iterator();
innerIterator = Collections.emptyIterator();
} public int next() {
return innerIterator.next();
} public boolean hasNext() {
if (innerIterator.hasNext()) {
return true;
} if (!outerIterator.hasNext()) {
return false;
} innerIterator = outerIterator.next().iterator(); return hasNext();
}
} /**
* Your Vector2D object will be instantiated and called as such:
* Vector2D i = new Vector2D(vec2d);
* while (i.hasNext()) v[f()] = i.next();
*/  

Python:

class Vector2D(object):

    # @param vec2d {List[List[int]]}
def __init__(self, vec2d):
# Initialize your data structure here
self.row, self.col, self.vec2d = 0, 0, vec2d # @return {int} a next element
def next(self):
# Write your code here
self.col += 1
return self.vec2d[self.row][self.col - 1] # @return {boolean} true if it has next element
# or false
def hasNext(self):
# Write your code here
while self.row < len(self.vec2d) and \
self.col >= len(self.vec2d[self.row]):
self.row, self.col = self.row + 1, 0
return self.row < len(self.vec2d) # Your Vector2D object will be instantiated and called as such:
# i, v = Vector2D(vec2d), []
# while i.hasNext(): v.append(i.next())

C++:

class Vector2D {
public:
Vector2D(vector<vector<int>>& vec2d) {
// Initialize your data structure here
begin = vec2d.begin();
end = vec2d.end();
pos = 0;
} int next() {
// Write your code here
hasNext();
return (*begin)[pos++];
} bool hasNext() {
// Write your code here
while (begin != end && pos == (*begin).size())
begin++, pos = 0;
return begin != end;
} private:
vector<vector<int>>::iterator begin, end;
int pos;
}; /**
* Your Vector2D object will be instantiated and called as such:
* Vector2D i(vec2d);
* while (i.hasNext()) cout << i.next();
*/

  

类似题目:

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

All LeetCode Questions List 题目汇总

[LeetCode] 251. Flatten 2D Vector 压平二维向量的更多相关文章

  1. [LeetCode] Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  2. LeetCode 251. Flatten 2D Vector

    原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...

  3. 用vector实现二维向量

    如果一个向量的每一个元素是一个向量,则称为二维向量,例如 vector<vector<int> >vv(3, vector<int>(4));//这里,两个“> ...

  4. 251. Flatten 2D Vector 平铺二维矩阵

    [抄题]: Implement an iterator to flatten a 2d vector. Example: Input: 2d vector = [ [1,2], [3], [4,5,6 ...

  5. 251. Flatten 2D Vector

    题目: Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6 ...

  6. [Leetcode] search a 2d matrix 搜索二维矩阵

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  7. [Swift]LeetCode251.展平二维向量 $ Flatten 2D Vector

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  8. Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)

    Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ...

  9. [VB.NET][C#]二维向量的基本运算

    前言 在数学中,几何向量指具有大小(Magnitude)和方向的几何对象,它在线性代数中经由抽象化有着更一般的概念.向量在编程中也有着及其广泛的应用,其作用在图形编程和游戏物理引擎方面尤为突出. 基于 ...

随机推荐

  1. Proxmox初步了解

    Proxmox不分主从,所有节点同步信息 创建集群 pvecm(可通过web界面创建.添加至集群) pvecm create cluster01 pvecm status 添加节点 pvecm add ...

  2. CentOS 6.x 无法格式化大于16TB的ext4分区处理

    CentOS 6.x 在格式化大于16TB的ext4分区时,会提示如下错误: mke2fs 1.41.12 (17-May-2010) mkfs.ext4: Size of device /dev/s ...

  3. django-用户浏览记录添加及商品详情页

    视图函数views.py # /goods/商品id class DetailView(View): '''详情页''' def get(self, request, goods_id): '''显示 ...

  4. L1141

    一,看题 1,位于0格可移动到相邻得1格.位于1格可移动到相邻的0格上. 2,从某一格开始可以移动的格子数.(应该不能重复,否则不久循环了.那就意味着我们可以要标记喽?) 3 二,写题 1,你是一次一 ...

  5. 14.go内置的rate包学习2(有花操作,必看)

    package main import ( "fmt" "golang.org/x/time/rate" "time" ) func mai ...

  6. vscode vue文件格式化没效果

    在vscode 中   格式化vue文件没效果 解决办法: 点击头部文件 >首选项>设置 在右侧加入这两句 "vetur.format.defaultFormatter.js&q ...

  7. 【洛谷P5049】旅行(数据加强版)

    题目链接 m=n-1是直接按字典序dfs就行, m=n时是一棵基环树,我们发现当一个点在环上时,可以把它和它的一个在环上的儿子之间的边删掉,然后回溯,到达它的第一个有其他儿子的祖先的另一个儿子上,我们 ...

  8. git dev分支合并线上master

    1.本地dev新建/切换本地master 新建 git checkout -b master 切换 git checkout  master 2.本地dev与本地master合并 git merge ...

  9. 如果要对img里面的值做特殊处理,可以直接写方法

    html <img :src="getMore('up')" alt=""> data里面定义的 one: 'http://p1.fishqc.ne ...

  10. 刷题记录:[SUCTF 2019]CheckIn

    目录 刷题记录:[SUCTF 2019]CheckIn 一.涉及知识点 1.利用.user.ini上传\隐藏后门 2.绕过exif_imagetype()的奇技淫巧 二.解题方法 刷题记录:[SUCT ...