https://www.lintcode.com/problem/541
和题目 左旋右旋迭代器 类似,在本题中,你将得到一个列表vecs,其中包括 k 个一维向量。
你的任务是通过 next 函数一个个地返回向量中的元素,按照 vecs[0][0], vecs[1][0]... vecs[k - 1][0], vecs[0][1], vecs[1][1]... vecs[k - 1][1], vecs[0][2], vecs[1][2]... vecs[k - 1][2]... 的顺序进行迭代。
样例
样例1
输入: k = 3
vecs = [
[1,2,3],
[4,5,6,7],
[8,9],
]
输出: [1,4,8,2,5,9,3,6,7]
样例2
输入: k = 3
vecs = [
[1,1,1]
[2,2,2]
[3,3,3]
]
输出: [1,2,3,1,2,3,1,2,3]
记录最后一个长度最大的行maxRow,记录最长行的长度m,当前在r行c列,每一次迭代,
检查r行c列是否有值,没有就下移一行,到最后一行的话,就跳转到第一行r=0,同时
列数c+1,获取有效的数的之后,r,c下移一个。注意判断r,c如果超过了maxRow,m-1的
位置,那就是没有数可以迭代了
public class ZigzagIterator2 {
//n:有多少行,m:最长的行有多少列
int n = 0, m = 0;
int r = 0, c=0,maxRow=0;//当前在第r行,第c列,maxCol表示最长的是哪一行
Integer next = null; //下一个数
List<List<Integer>> ll = new ArrayList<>();
public ZigzagIterator2(List<List<Integer>> vecs) {
ll = vecs;
n = ll.size();
//找打最大的列数,以及迭代器的第一个数
for (int i = 0; i < n; i++) {
if(ll.get(i).size() >= m){
m = ll.get(i).size();
maxRow = i;
}
}
}
public int next() {
while (true){
if(r==maxRow && c==m ) break; //在最长的一行,并且超过最大列的长度
//检查是否是最后一个
if(r == maxRow && c == m-1){
//System.out.println("是否是最后一个了");
next = ll.get(r).get(c);
c++;
break;
}
if(ll.get(r).size()>c){
//System.out.println(" 获取值了:r="+r+" c="+c);
next = ll.get(r).get(c);
r= r+1;
if(r ==n){
r=0;
c+=1;
}
break;
}
r++;
if(r ==n){
r=0;
c+=1;
}
}
return next;
}
public boolean hasNext() {
//System.out.println(r+" "+c+" || "+ " macrow:"+maxRow+" m="+m);
if(r == maxRow && c<m) return true;
if(r!=maxRow && c<m) return true;
return false;
}
}
/**
* Your ZigzagIterator2 object will be instantiated and called as such:
* ZigzagIterator2 solution = new ZigzagIterator2(vecs);
* while (solution.hasNext()) result.add(solution.next());
* Output result
*/
import java.util.*;
public class LC541 {
static class ZigzagIterator2 {
//n:有多少行,m:最长的行有多少列
int n = 0, m = 0;
int r = 0, c = 0, maxRow = 0;//当前在第r行,第c列,maxCol表示最长的是哪一行
Integer next = null; //下一个数
List<List<Integer>> ll = new ArrayList<>();
public ZigzagIterator2(List<List<Integer>> vecs) {
ll = vecs;
n = ll.size();
//找打最大的列数,以及迭代器的第一个数
for (int i = 0; i < n; i++) {
if (ll.get(i).size() >= m) {
m = ll.get(i).size();
maxRow = i;
}
}
}
public int next() {
while (true) {
if (r == maxRow && c == m) break; //在最长的一行,并且超过最大列的长度
//检查是否是最后一个
if (r == maxRow && c == m - 1) {
//System.out.println("是否是最后一个了");
next = ll.get(r).get(c);
c++;
break;
}
if (ll.get(r).size() > c) {
//System.out.println(" 获取值了:r="+r+" c="+c);
next = ll.get(r).get(c);
r = r + 1;
if (r == n) {
r = 0;
c += 1;
}
break;
}
r++;
if (r == n) {
r = 0;
c += 1;
}
}
return next;
}
public boolean hasNext() {
//System.out.println(r+" "+c+" || "+ " macrow:"+maxRow+" m="+m);
if (r == maxRow && c < m) return true;
if (r != maxRow && c < m) return true;
return false;
}
}
public static void main(String[] args) {
test1();
}
public static void test1() {
List<List<Integer>> ll1 = new ArrayList<>();
ll1.add(Arrays.asList(9, 3, 2, 4, 8));
ll1.add(Arrays.asList(1, 2, 3, 4, 2));
ZigzagIterator2 solution = new ZigzagIterator2(ll1);
List<Integer> result = new ArrayList<>();
while (solution.hasNext()) result.add(solution.next());
System.out.println(result);
}
/*
输入数据
[[9,3,2,4,8],[1,2,3,4,2]]
输出数据
[9,1,3,2,2,3,4,4,8]
期望答案
[9,1,3,2,2,3,4,4,8,2]
*/
public static void test2() {
List<List<Integer>> ll1 = new ArrayList<>();
ll1.add(Arrays.asList(1, 2, 3));
ll1.add(Arrays.asList(4, 5, 6, 7));
ll1.add(Arrays.asList(8, 9));
ZigzagIterator2 solution = new ZigzagIterator2(ll1);
List<Integer> result = new ArrayList<>();
while (solution.hasNext()) result.add(solution.next());
System.out.println(result);
}
/**
* Your ZigzagIterator2 object will be instantiated and called as such:
* ZigzagIterator2 solution = new ZigzagIterator2(vecs);
* while (solution.hasNext()) result.add(solution.next());
* Output result
*/
}