将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
1、这代码写的简直在犯罪,java的二维ArrayList跟想象中的不太一样 // List<Character>[][] lists = new ArrayList[numRows][];
,
感觉没有C++好用,直到看了题解才发现可以在泛型里放StringBuilder,原来是自己太菜
2、 注释为官方题解
class Solution {
public String convert(String s, int numRows) {
/* 官方题解
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < Math.min(numRows, s.length()); i++)
rows.add(new StringBuilder());
*/
if(s.length()<2 || s.length()<=numRows || numRows ==1)
return s;
ArrayList<ArrayList<Character>> lists = new ArrayList<>();
int path = 0;
boolean goDown = true;
/* 官方题解 foreach真香!curRow这段写的真漂亮
for (char c : s.toCharArray()) {
rows.get(curRow).append(c);
if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
*/
for(int i=0; i<s.length(); i++){
if(i<numRows){
ArrayList<Character> tmp = new ArrayList<>();
lists.add(tmp);
}
lists.get(path).add(s.charAt(i));
if(goDown)
path++;
else
path--;
if(path >= numRows){
path = numRows-2;
goDown = !goDown;
}
if(path < 0){
path = 1;
goDown = !goDown;
}
}
/*官方题解
StringBuilder ret = new StringBuilder();
for (StringBuilder row : rows)
ret.append(row);
return ret.toString();
*/
StringBuilder ans = new StringBuilder();
for(int i=0; i<numRows; i++){
int len =lists.get(i).size();
for(int j=0; j<len; j++)
ans.append(lists.get(i).get(j));
}
return ans.toString();
}
}