
这个题的关键在于控制到达行0或者行的最大值时往回走的问题,有点像个铁道兵,走到路的尽头就返回。
自己的解法,使用string数组,string在频繁变化时效率比较低,不过整体还可以:
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
String[] levelString = new String[numRows];
Arrays.fill(levelString, "");
int forward = 1;
int row = 0;
for (int i = 0; i < s.length(); i++) {
levelString[row] += s.charAt(i);
if (row == numRows - 1) {
forward = -1;
}
if (row == 0) {
forward = 1;
}
row += forward;
}
String res = "";
for (int j = 0; j < numRows; j++) {
res += levelString[j];
}
return res;
}
}
官方解法,使用StringBuilder,整体效率会更高,这个转向直接用!也更巧妙:
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();
}
}
网友评论