题目
这道题目看着花里胡哨的,还搞个啥Z字形变换
实际上,如果我们看穿它的表象,就会发现,它的本质非常简单,以范例二给的数据绘图:
表面上看起来是上图的Z字形,但实际上是:
就是将一个一维的数组按先后顺序存入到多维数组中
而顺序则是自上而下,再上,如此循环,直至数据全部存储完
我的代码是:
class Solution {
public String convert(String s, int numRows) {
if(numRows==1) return s;
ArrayList<Character>[] list=new ArrayList[numRows];
int i=0,j=0;
boolean goDown=true;
String result="";
for(i=0;i<numRows;i++) list[i]=new ArrayList();
i=0;
while(j<s.length()){
list[i].add(s.charAt(j++));
i+= (goDown)? 1:-1;
if(i==numRows){
goDown=false;
i=i-2;
}
if(i==-1){
goDown=true;
i=i+2;
}
}
for(i=0;i<numRows;i++){
for(int k=0;k<list[i].size();k++) {
result=result+list[i].get(k);
}
}
return result;
}
}
我创建了一个list列表用于数据的存储,以goDown判断下一个数据应该存在下一个list还是前一个list
运行结果如下:
最后附上官方解答:
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < Math.min(numRows, s.length()); i++)
rows.add(new StringBuilder());
int curRow = 0;
boolean goingDown = false;
for (char c : s.toCharArray()) {
rows.get(curRow).append(c);
if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
StringBuilder ret = new StringBuilder();
for (StringBuilder row : rows) ret.append(row);
return ret.toString();
}
}
(小声BB:和我的差不多嘛,运行结果差的也不大)