[LeetCode] 281. Zigzag Iterator 之字形迭代器
Given two 1d vectors, implement an iterator to return their elements alternately.
Example:
Input:
v1 = [1,2]
v2 = [3,4,5,6] Output:[1,3,2,4,5,6] Explanation:
By calling next repeatedly until hasNext returnsfalse
,
the order of elements returned by next should be:[1,3,2,4,5,6]
.
Follow up: What if you are given k
1d vectors? How well can your code be extended to such cases?
Clarification for the follow up question:
The "Zigzag" order is not clearly defined and is ambiguous for k > 2
cases. If "Zigzag" does not look right to you, replace "Zigzag" with "Cyclic". For example:
Input:
[1,2,3]
[4,5,6,7]
[8,9] Output:[1,4,8,2,5,9,3,6,7]
.
这道题让我们写一个之字形迭代器,跟之前那道 Flatten 2D Vector 有些类似,那道题是横向打印,这道题是纵向打印,虽然方向不同,但是实现思路都是大同小异。博主最先想到的方法是用两个变量i和j分别记录两个向量的当前元素位置,初始化为0,然后当 i<=j 时,则说明需要打印 v1 数组的元素,反之则打印 v2 数组中的元素。在 hasNext 函数中,当i或j打印等于对应数组的长度时,将其赋为一个特大值,这样不影响打印另一个数组的值,只有当i和j都超过格子数组的长度时,返回 false,参见代码如下:
解法一:
class ZigzagIterator {
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
v.push_back(v1);
v.push_back(v2);
i = j = ;
}
int next() {
return i <= j ? v[][i++] : v[][j++];
}
bool hasNext() {
if (i >= v[].size()) i = INT_MAX;
if (j >= v[].size()) j = INT_MAX;
return i < v[].size() || j < v[].size();
}
private:
vector<vector<int>> v;
int i, j;
};
下面来看另一种解法,这种解法直接在初始化的时候就两个数组按照之字形的顺序存入另一个一位数组中了,那么就按顺序打印新数组中的值即可,参见代码如下:
解法二:
class ZigzagIterator {
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
int n1 = v1.size(), n2 = v2.size(), n = max(n1, n2);
for (int i = ; i < n; ++i) {
if (i < n1) v.push_back(v1[i]);
if (i < n2) v.push_back(v2[i]);
}
}
int next() {
return v[i++];
}
bool hasNext() {
return i < v.size();
}
private:
vector<int> v;
int i = ;
};
由于题目中的 Follow up 让将输入换成k个数组的情况,那么上面的解法一就不适用了,解法二的空间复杂度比较高,所以需要一种更高效的方法。这里可以采用 queue 加 iterator 的方法,用一个 queue 里面保存 iterator 的 pair,在初始化的时候,有几个数组就生成几个 pair 放到 queue 中,每个 pair 保存该数组的首位置和尾位置的 iterator,在 next() 函数中,取出 queue 队首的一个 pair,如果当前的 iterator 不等于 end(),将其下一个位置的 iterator 和 end 存入队尾,然后返回当前位置的值。在 hasNext() 函数中,只需要看 queue 是否为空即可,参见代码如下:
解法三:
class ZigzagIterator {
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2) {
if (!v1.empty()) q.push(make_pair(v1.begin(), v1.end()));
if (!v2.empty()) q.push(make_pair(v2.begin(), v2.end()));
}
int next() {
auto it = q.front().first, end = q.front().second;
q.pop();
if (it + != end) q.push(make_pair(it + , end));
return *it;
}
bool hasNext() {
return !q.empty();
}
private:
queue<pair<vector<int>::iterator, vector<int>::iterator>> q;
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/281
类似题目:
参考资料:
https://leetcode.com/problems/zigzag-iterator/
https://leetcode.com/problems/zigzag-iterator/discuss/71781/Short-Java-O(1)-space
https://leetcode.com/problems/zigzag-iterator/discuss/71779/Simple-Java-solution-for-K-vector
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] 281. Zigzag Iterator 之字形迭代器的更多相关文章
- [LeetCode] Zigzag Iterator 之字形迭代器
Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...
- [LeetCode#281] Zigzag Iterator
Problem: Given two 1d vectors, implement an iterator to return their elements alternately. For examp ...
- 281. Zigzag Iterator
题目: Given two 1d vectors, implement an iterator to return their elements alternately. For example, g ...
- 【LeetCode】281. Zigzag Iterator 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 deque 日期 题目地址:https://leetc ...
- [LeetCode] 284. Peeking Iterator 瞥一眼迭代器
Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...
- 281. Zigzag Iterator z字型遍历
[抄题]: Given two 1d vectors, implement an iterator to return their elements alternately. Example: Inp ...
- 【LeetCode】ZigZag Conversion(Z 字形变换)
这道题是LeetCode里的第6道题. 题目要求: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...
- [LeetCode] 6. ZigZag Conversion 之字型转换字符串
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- [Locked] Zigzag Iterator
Zigzag Iterator Given two 1d vectors, implement an iterator to return their elements alternately. Fo ...
随机推荐
- MongoDB创建数据库和删除数据库05-14学习笔记
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关 ...
- C# 关于使用JavaScriptSerializer 序列化与返序列化的操作
//开始解析 //引用 //using System.Web.Script.Serialization; JavaScriptSerializer js = new JavaScriptSerial ...
- js、jquery、css属性及出错集合
*)注意使用jquery设置css的语法 css("propertyname","value");#单个时时逗号 css({"propertyname ...
- Java生鲜电商平台-技术方案与文档下载
Java生鲜电商平台-技术方案与文档下载 说明:任何一个好的项目,都应该有好的文档与设计方案,包括需求文档,概要设计,详细设计,测试用例,验收报告等等,类似下面这个图: 有以下几个管理域: 1. 开发 ...
- 转 Fortofy扫描漏洞解决方案
Log Forging漏洞: 数据从一个不可信赖的数据源进入应用程序. 在这种情况下,数据经由CreditCompanyController.java 的第 53行进入 getParameter(). ...
- RabbitMQ启动报unknown exchange type 'x-delayed-message'
RabbitMQ延迟队列插件未安装,导致以下问题: ShutdownSignalException: connection error; protocol method: #method<con ...
- linux 进程通信之 守护进程
守护进程(Daemon) Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的时间.一般采用以d结尾的名字.从下面的进程信息可以看出, ...
- apache配置项
环境:apache2.24 apache 官方文档:http://httpd.apache.org/docs/2.4/ 全部指令索引: http://httpd.apache.org/docs/ ...
- 算法学习day01 栈和队列
1,设计一个算法利用顺序栈的基本运算判断一个字符串是否是回文 解题思路: 由于回文是从前到后和从后到前读都是一样的,所以只要将待判断的字符串颠倒 然后与原字符串相比较,就可以决定是否是回文了 ...
- 201871010112-梁丽珍《面向对象程序设计(java)》第八周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...