题目
方法一:按行访问
找规律
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
int cycleLen = 2 * numRows - 2;
int len = s.length();
StringBuilder ret = new StringBuilder();
for (int i = 0; i < numRows; i++) {
for (int j =0; j + i < len; j += cycleLen) {
ret.append(s.charAt(j + i));
if (i != 0 && i != numRows - 1 && cycleLen - i + j < len) {
ret.append(s.charAt(cycleLen - i + j));
}
}
}
return ret.toString();
}
}
- 时间复杂度:O(n),对于len == s.length(),每个索引被访问一次
- 空间复杂度:O(n)
方法二:
利用flag进行转向
太妙了
class Solution {
public String convert(String s, int numRows) {
if (numRows < 2) return s;
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
rows.add(new StringBuilder());
}
int i = 0;
int flag = -1;
for (char c : s.toCharArray()) {
rows.get(i).append(c);
if (i == 0 || i == numRows - 1) {
flag = ~flag + 1;
}
i += flag;
}
StringBuilder ret = new StringBuilder();
for (StringBuilder row : rows) {
ret.append(row);
}
return ret.toString();
}
}
- 时间复杂度:O(n),只遍历了一次字符串
- 空间复杂度:O(n),各行字符串只暂用了n行空间