今天刷了leetcode第6题,Z字形变换,后来终于解决了。这里附上源码:
LinkedList[] list = new LinkedList[numRows];
for (int i = 0; i < numRows; i++) {
list[i] = new LinkedList<Character>();
}
int length = 0;
while (length < s.length()) {
for (int i = 0; i < numRows && length < s.length(); i++) {
list[i].add(s.charAt(length++));
}
for (int i = numRows - 2; i > 0 && length < s.length(); i--) {
list[i].add(s.charAt(length++));
}
}
for (int i = 1; i < numRows; i++) {
int size = list[i].size();
for (int j = 0; j < size; j++) {
list[0].add(list[i].remove());
}
}
String str = list[0].toString();
return str.substring(1, str.length() - 1).replaceAll(", ", "");
下面是我解题的思路:
按Z字形排列的话,就像是给你一个二维的数组,我们按列排,排完这一列,再排另外一列,并且每一列排的数据个数并不是固定的,如果真的用二维数组来存放它排列后的数据,就很麻烦,如果我们观察每一行的话,它就是相当于一个数组,也就是说我们不用考虑数据在每一列具体是什么位置,只要它在每一行的顺序没有错误就可以了。并转换以后,读取数据是从每一行的头开始读的,实际上就是先进先出,所以,每一行我们就可以用一个队列来表示,java里面用LinkedList实现了Queue的接口,所以用它来存放每一行要存储的数据,Z字形转换的规律就是:先从0一直到numRows-1;然后再从numRows-1到0;就这样一直循环。所以在while循环里面,不停的进行判断示意图如下: