题目描述


方法
个人理解:
- 用
numRows个StringBuilder对象代表numRows行 - 使用一个
curRow变量用于跟踪当前行,用一个goingDown变量跟踪遍历方向(curRow++还是--) - 顺序遍历字符串字符,将字符添加到对应的行(StringBuilder对象)中
- 整合所有的行(StringBuilder对象),并输出
class Solution {
public String convert(String s, int numRows) {
//如果行数为1行,返回原字符串
if(numRows == 1) return s;
//定义一个列表用于存储每一行
List<StringBuilder> rows = new ArrayList<>();
//使用min(numRows, s.length()代表非空行数是因为字符串长度可能小于行数
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();
}
}
个人理解:
- 第一行Z型两竖边上的字符间隔为
cycleLen = 2 * numRows - 2 - 用
i遍历每一行,j代表第一行Z型竖边上的字符的下标,j+i代表第i行Z型竖边上的字符的下标’j+i<n,每一行两竖边之间只有一个字符,该字符的下标为j + cycleLen - i < n - 按行遍历,根据
i添加字符

class Solution {
public String convert(String s, int numRows) {
//字符串长度
int n = s.length();
if(numRows == 1) return s;
//定义字符间隔cycleLen
int cycleLen = 2 * numRows - 2;
//用于存储字符串
StringBuilder res = new StringBuilder();
//两层循环,i代表行数,j代表第一行相隔cycleLen的字符下标,
//j+i代表第i行相隔cycleLen的下标,j+cycleLen - i代表间隔中间的字符
for(int i = 0; i < numRows; i++) {
for(int j = 0; j + i < n; j += cycleLen) {
res.append(s.charAt(j+i));
if(i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
res.append(s.charAt(j + cycleLen - i));
}
}
}
return res.toString();
}
}