这一题其实没有什么很取巧的东西。就是两个数组来回跳就完事了,与其说是复杂还不如说是要小心处理。
但是follow up 是要你兼容K个数组,其实也是差不多的,把K个数组放进一个ArrayList里面当成是一个2d数组就好了。然后就是保持两个cursors,一个是对行的,另一个是对列的。对行的cursor不停往下走,走到最下面那个array之后对列的cursor的往前走一步。在这个过程里,如果某个数组的长度小于关于列的cursor,就直接删掉。
主要算法的理论就是上面那样的。只是要注意的是hasNext或者next的一方是要做对数组cursors的维护的,1. 关于行的cursor是否超过行数的总数,是的话关于列的cursor前进一格,关于行的cursor回到0。2. 如果一个列的cursor超过了一个数组的长度,直接删掉,往下寻找。 给出代码如下:
public class ZigzagIterator {
int rowCursor = 0;
int colCursor = 0;
ArrayList<List<Integer>> data;
public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
data = new ArrayList<>();
data.add(v1);
data.add(v2);
}
public int next() {
int result = data.get(colCursor).get(rowCursor);
colCursor++;
if (colCursor >= data.size()) {
colCursor = 0;
rowCursor++;
}
return result;
}
public boolean hasNext() {
while(!data.isEmpty() && rowCursor >= data.get(colCursor).size()) {
data.remove(colCursor);
if (colCursor >= data.size()) {
colCursor = 0;
rowCursor++;
}
}
return !data.isEmpty();
}
}